home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 2 / AACD 2.iso / AACD / Programming / fpc / compiler / i386.pas < prev    next >
Pascal/Delphi Source File  |  1998-09-24  |  90KB  |  1,840 lines

  1. {
  2.     $Id: i386.pas,v 1.1.1.1.2.1 1998/04/06 16:21:09 peter Exp $
  3.     Copyright (c) 1995-98 by Florian Klaempfl
  4.  
  5.     This unit implements an types and classes specific for the i386+
  6.  
  7.     This program is free software; you can redistribute it and/or modify
  8.     it under the terms of the GNU General Public License as published by
  9.     the Free Software Foundation; either version 2 of the License, or
  10.     (at your option) any later version.
  11.  
  12.     This program is distributed in the hope that it will be useful,
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.     GNU General Public License for more details.
  16.  
  17.     You should have received a copy of the GNU General Public License
  18.     along with this program; if not, write to the Free Software
  19.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  
  21.  ****************************************************************************
  22. }
  23. unit i386;
  24.  
  25.   interface
  26.  
  27.     uses
  28.        strings,systems,cobjects,globals,aasm,files,verbose;
  29.  
  30.     const
  31.       extended_size = 10;
  32.  
  33.     type
  34.        tasmop = (
  35.          A_MOV,A_MOVZX,A_MOVSX,A_LABEL,A_ADD,
  36.          A_CALL,A_IDIV,A_IMUL,A_JMP,A_LEA,A_MUL,A_NEG,A_NOT,
  37.          A_POP,A_POPAD,A_PUSH,A_PUSHAD,A_RET,A_SUB,A_XCHG,A_XOR,
  38.          A_FILD,A_CMP,A_JZ,A_INC,A_DEC,A_SETE,A_SETNE,A_SETL,
  39.          A_SETG,A_SETLE,A_SETGE,A_JE,A_JNE,A_JL,A_JG,A_JLE,A_JGE,
  40.          A_OR,A_FLD,A_FADD,A_FMUL,A_FSUB,A_FDIV,A_FCHS,A_FLD1,
  41.          A_FIDIV,A_CLTD,A_JNZ,A_FSTP,A_AND,A_JNO,A_NOTH,A_NONE,
  42.          A_ENTER,A_LEAVE,A_CLD,A_MOVS,A_REP,A_SHL,A_SHR,A_BOUND,
  43.          A_JNS,A_JS,A_JO,A_SAR,A_TEST,
  44.          A_FCOM,A_FCOMP,A_FCOMPP,A_FXCH,A_FADDP,A_FMULP,A_FSUBP,A_FDIVP,
  45.          A_FNSTS,A_SAHF,A_FDIVRP,A_FSUBRP,A_SETC,A_SETNC,A_JC,A_JNC,
  46.          A_JA,A_JAE,A_JB,A_JBE,A_SETA,A_SETAE,A_SETB,A_SETBE,
  47.          A_AAA,A_AAD,A_AAM,A_AAS,A_CBW,A_CDQ,A_CLC,A_CLI,
  48.          A_CLTS,A_CMC,A_CWD,A_CWDE,A_DAA,A_DAS,A_HLT,A_IRET,A_LAHF,
  49.          A_LODS,A_LOCK,A_NOP,A_PUSHA,A_PUSHF,A_PUSHFD,
  50.          A_STC,A_STD,A_STI,A_STOS,A_WAIT,A_XLAT,A_XLATB,A_MOVSB,
  51.          A_MOVSBL,A_MOVSBW,A_MOVSWL,A_MOVZB,A_MOVZWL,A_POPA,A_IN,
  52.          A_OUT,A_LDS,A_LCS,A_LES,A_LFS,A_LGS,A_LSS,A_POPF,A_SBB,A_ADC,
  53.          A_DIV,A_ROR,A_ROL,A_RCL,A_RCR,A_SAL,A_SHLD,A_SHRD,
  54.          A_LCALL,A_LJMP,A_LRET,A_JNAE,A_JNB,A_JNA,A_JNBE,A_JP,A_JNP,
  55.          A_JPE,A_JPO,A_JNGE,A_JNG,A_JNL,A_JNLE,A_JCXZ,A_JECXZ,
  56.          A_LOOP,A_CMPS,A_INS,A_OUTS,A_SCAS,A_BSF,A_BSR,A_BT,A_BTC,A_BTR,A_BTS,A_INT,
  57.          A_INT3,A_INTO,A_BOUNDL,A_BOUNDW,
  58.          A_LOOPZ,A_LOOPE,A_LOOPNZ,A_LOOPNE,A_SETO,A_SETNO,A_SETNAE,A_SETNB,
  59.          A_SETZ,A_SETNZ,A_SETNA,A_SETNBE,A_SETS,A_SETNS,A_SETP,A_SETPE,A_SETNP,
  60.          A_SETPO,A_SETNGE,A_SETNL,A_SETNG,A_SETNLE,A_ARPL,A_LAR,A_LGDT,A_LIDT,
  61.          A_LLDT,A_LMSW,A_LSL,A_LTR,A_SGDT,A_SIDT,A_SLDT,A_SMSW,A_STR,A_VERR,A_VERW,
  62.          A_FABS,A_FBLD,A_FBSTP,A_FCLEX,A_FNCLEX,
  63.          A_FCOS,A_FDECSTP,A_FDISI,A_FNDISI,
  64.          A_FDIVR,A_FENI,A_FNENI,A_FFREE,A_FIADD,A_FICOM,A_FICOMP,
  65.          A_FIDIVR,A_FIMUL,A_FINCSTP,A_FINIT,A_FNINIT,A_FIST,A_FISTP,A_FISUB,
  66.          A_FISUBR,A_FLDCW,A_FLDENV,A_FLDLG2,A_FLDLN2,A_FLDL2E,
  67.          A_FLDL2T,A_FLDPI,A_FLDS,A_FLDZ,A_FNOP,A_FPATAN,
  68.          A_FPREM,A_FPREM1,A_FPTAN,A_FRNDINT,A_FRSTOR,A_FSAVE,A_FNSAVE,
  69.          A_FSCALE,A_FSETPM,A_FSIN,A_FSINCOS,A_FSQRT,A_FST,A_FSTCW,A_FNSTCW,
  70.          A_FSTENV,A_FNSTENV,A_FSTSW,A_FNSTSW,A_FTST,A_FUCOM,A_FUCOMP,
  71.          A_FUCOMPP,A_FWAIT,A_FXAM,A_FXTRACT,A_FYL2X,A_FYL2XP1,A_F2XM1,
  72.          A_FILDQ,A_FILDS,A_FILDL,A_FLDL,A_FLDT,A_FISTQ,A_FISTS,A_FISTL,A_FSTL,A_FSTS,
  73.          A_FSTPS,A_FISTPL,A_FSTPL,A_FISTPS,A_FISTPQ,A_FSTPT,
  74.          A_FCOMPS,A_FICOMPL,A_FCOMPL,A_FICOMPS,
  75.          A_FCOMS,A_FICOML,A_FCOML,A_FICOMS,A_FIADDL,A_FADDL,A_FIADDS,
  76.          A_FISUBL,A_FSUBL,A_FISUBS,A_FSUBS,A_FSUBR,A_FSUBRS,A_FISUBRL,
  77.          A_FSUBRL,A_FISUBRS,A_FMULS,A_FIMULL,A_FMULL,A_FIMULS,A_FDIVS,A_FIDIVL,
  78.          A_FDIVL,A_FIDIVS,A_FDIVRS,A_FIDIVRL,A_FDIVRL,A_FIDIVRS,
  79.          A_REPE,A_REPNE,A_FADDS,A_POPFD,
  80.          { MMX instructions: }
  81.          A_EMMS,A_MOVD,A_MOVQ,A_PACKSSDW,A_PACKSSWB,A_PACKUSWB,
  82.          A_PADDB,A_PADDD,A_PADDSB,A_PADDSW,A_PADDUSB,A_PADDUSW,
  83.          A_PADDW,A_PAND,A_PANDN,A_PCMPEQB,A_PCMPEQD,A_PCMPEQW,
  84.          A_PCMPGTB,A_PCMPGTD,A_PCMPGTW,A_PMADDWD,A_PMULHW,
  85.          A_PMULLW,A_POR,A_PSLLD,A_PSLLQ,A_PSLLW,A_PSRAD,A_PSRAW,
  86.          A_PSRLD,A_PSRLQ,A_PSRLW,A_PSUBB,A_PSUBD,A_PSUBSB,A_PSUBSW,
  87.          A_PSUBUSB,A_PSUBUSW,A_PSUBW,A_PUNPCKHBW,A_PUNPCKHDQ,
  88.          A_PUNPCKHWD,A_PUNPCKLBW,A_PUNPCKLDQ,A_PUNPCKLWD,A_PXOR);
  89.     const
  90.       firstop = A_MOV;
  91.       lastop  = A_PXOR;
  92.  
  93.     type
  94.        { enumeration for registers, don't change this }
  95.        { it's used by the register size converstaions }
  96.        tregister = (
  97.          R_NO,R_EAX,R_ECX,R_EDX,R_EBX,R_ESP,R_EBP,R_ESI,R_EDI,
  98.          R_AX,R_CX,R_DX,R_BX,R_SP,R_BP,R_SI,R_DI,
  99.          R_AL,R_CL,R_DL,R_BL,R_AH,R_CH,R_BH,R_DH,
  100.          { for an easier assembler generation }
  101.          R_DEFAULT_SEG,R_CS,R_DS,R_ES,R_FS,R_GS,R_SS,
  102.          R_ST,R_ST0,R_ST1,R_ST2,R_ST3,R_ST4,R_ST5,R_ST6,R_ST7,
  103.          R_MM0,R_MM1,R_MM2,R_MM3,R_MM4,R_MM5,R_MM6,R_MM7);
  104.  
  105.        topsize = (S_NO,S_B,S_W,S_L,S_BW,S_BL,S_WL,S_Q,S_S,S_X,S_D);
  106.  
  107.        plocation = ^tlocation;
  108.  
  109.        { information about the location of an operand }
  110.        { LOC_FPUSTACK    FPU stack }
  111.        { LOC_REGISTER    in a processor register }
  112.        { LOC_MEM         in the memory }
  113.        { LOC_REFERENCE   like LOC_MEM, but lvalue }
  114.        { LOC_JUMP        nur bool'sche Resultate, Sprung zu false- oder }
  115.        {                 truelabel }
  116.        { LOC_FLAGS       nur bool'sche Rsultate, Flags sind gesetzt }
  117.        { LOC_CREGISTER   register which shouldn't be modified }
  118.        { LOC_INVALID     added for tracking problems}
  119.  
  120.        tloc = (LOC_INVALID,LOC_FPU,LOC_REGISTER,LOC_MEM,LOC_REFERENCE,LOC_JUMP,
  121.                LOC_FLAGS,LOC_CREGISTER,LOC_MMXREGISTER,LOC_CMMXREGISTER);
  122.  
  123.        tresflags = (F_E,F_NE,F_G,F_L,F_GE,F_LE,F_C,F_NC,
  124.                     F_A,F_AE,F_B,F_BE);
  125.  
  126.        preference = ^treference;
  127.  
  128.        treference = record
  129.           base,segment,index : tregister;
  130.           offset : longint;
  131.           symbol : pstring;
  132.           { a constant is also a treference, this makes the code generator }
  133.           { easier                                                         }
  134.           isintvalue : boolean;
  135.           scalefactor : byte;
  136.        end;
  137.  
  138.        tlocation = record
  139.           case loc : tloc of
  140.              { segment in reference at the same place as in loc_register }
  141.              LOC_REGISTER,LOC_CREGISTER : (register,segment : tregister);
  142.              LOC_MEM,LOC_REFERENCE : (reference : treference);
  143.              LOC_FPU : ();
  144.              LOC_JUMP : ();
  145.              LOC_FLAGS : (resflags : tresflags);
  146.              LOC_INVALID : ();
  147.  
  148.              { it's only for better handling }
  149.              LOC_MMXREGISTER : (mmxreg : tregister);
  150.        end;
  151.  
  152.        pcsymbol = ^tcsymbol;
  153.  
  154.        tcsymbol = record
  155.           symbol : pchar;
  156.           offset : longint;
  157.        end;
  158.  
  159.     const
  160.        { arrays for boolean location conversions }
  161.        flag_2_jmp : array[F_E..F_BE] of tasmop =
  162.           (A_JE,A_JNE,A_JG,A_JL,A_JGE,A_JLE,A_JC,A_JNC,
  163.            A_JA,A_JAE,A_JB,A_JBE);
  164.  
  165.        flag_2_set : array[F_E..F_BE] of tasmop =        { v-- the GAS didn't know setc }
  166.           (A_SETE,A_SETNE,A_SETG,A_SETL,A_SETGE,A_SETLE,A_SETB,A_SETAE,
  167.            A_SETA,A_SETAE,A_SETB,A_SETBE);
  168.  
  169.        { operand types }
  170.        top_none = 0;
  171.        top_reg = 1;
  172.        top_ref = 2;
  173.  
  174.        { a constant can be also written as treference }
  175.        top_const = 3;
  176.  
  177.        { this is for calls }
  178.        top_symbol = 4;
  179.  
  180.        stack_pointer = R_ESP;
  181.  
  182.        frame_pointer = R_EBP;
  183.  
  184.        {This constant is an alias for the accumulator, as it's name may
  185.         differ from processor to processor.}
  186.        accumulator = R_EAX;
  187.  
  188.     type
  189.  
  190.        pai_labeled = ^tai_labeled;
  191.  
  192.        tai_labeled = object(tai)
  193.           _operator : tasmop;
  194.           lab : plabel;
  195.           constructor init(op : tasmop; l : plabel);
  196.           destructor done;virtual;
  197.        end;
  198.  
  199.        pai386 = ^tai386;
  200.  
  201.        tai386 = object(tai)
  202.           { this isn't a proper style, but not very memory expensive }
  203.           op1,op2: pointer;
  204.           _operator : tasmop;
  205.           opxt:word;
  206.           size:topsize;
  207.           constructor op_none(op : tasmop;_size : topsize);
  208.  
  209.           constructor op_reg(op : tasmop;_size : topsize;_op1 : tregister);
  210.           constructor op_const(op : tasmop;_size : topsize;_op1 : longint);
  211.           constructor op_ref(op : tasmop;_size : topsize;_op1 : preference);
  212.           constructor op_loc(op : tasmop;_size : topsize;_op1 : tlocation);
  213.  
  214.           constructor op_reg_reg(op : tasmop;_size : topsize;_op1,_op2 : tregister);
  215.           constructor op_reg_ref(op : tasmop;_size : topsize;_op1 : tregister;_op2 : preference);
  216.           constructor op_reg_loc(op : tasmop;_size : topsize;_op1 : tregister;_op2 : tlocation);
  217.           constructor op_loc_reg(op : tasmop;_size : topsize;_op1 : tlocation;_op2 : tregister);
  218.  
  219.           constructor op_const_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister);
  220.           { this combination is needed by ENTER }
  221.           constructor op_const_const(op : tasmop;_size : topsize;_op1,_op2 : longint);
  222.           constructor op_const_ref(op : tasmop;_size : topsize;_op1 : longint;_op2 : preference);
  223.           constructor op_const_loc(op : tasmop;_size : topsize;_op1 : longint;_op2 : tlocation);
  224.  
  225.           constructor op_ref_reg(op : tasmop;_size : topsize;_op1 : preference;_op2 : tregister);
  226.           { this is only allowed if _op1 is an int value (_op1^.isintvalue=true) }
  227.           constructor op_ref_ref(op : tasmop;_size : topsize;_op1,_op2 : preference);
  228.           {
  229.           constructor op_ref_loc(op : tasmop;_size : topsize;_op1 : preference;_op2 : tlcation);}
  230.  
  231.           constructor op_const_reg_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister;_op3 : tregister);
  232.  
  233.           { this is for CALL etc.                            }
  234.           { symbol is replaced by the address of symbol      }
  235.           { so op_csymbol(A_PUSH,S_L,strnew('P')); generates }
  236.           { an instruction which pushes the address of P     }
  237.           { to the stack                                     }
  238.           constructor op_csymbol(op : tasmop;_size : topsize;_op1 : pcsymbol);
  239.           constructor op_csymbol_reg(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : tregister);
  240.           constructor op_csymbol_ref(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : preference);
  241.           constructor op_csymbol_loc(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : tlocation);
  242.           { OUT immediate8  }
  243.           constructor op_reg_const(op:tasmop; _size: topsize; _op1: tregister; _op2: longint);
  244.           function op1t:byte;
  245.           function op2t:byte;
  246.           function op3t:byte;
  247.           destructor done;virtual;
  248.        end;
  249.  
  250.  
  251.  
  252.     const
  253.        maxvarregs = 4;
  254.  
  255.        varregs : array[1..maxvarregs] of tregister =
  256.          (R_EBX,R_EDX,R_ECX,R_EAX);
  257.  
  258.        nextlabelnr : longint = 1;
  259.  
  260.     { the following functions allow to convert registers }
  261.     { for example reg8toreg32(R_AL) returns R_EAX        }
  262.     { for example reg16toreg32(R_AL) gives an undefined  }
  263.     { result                                             }
  264.     { these functions expects that the turn of           }
  265.     { tregister isn't changed                            }
  266.     function reg8toreg16(reg : tregister) : tregister;
  267.     function reg8toreg32(reg : tregister) : tregister;
  268.     function reg16toreg8(reg : tregister) : tregister;
  269.     function reg32toreg8(reg : tregister) : tregister;
  270.     function reg32toreg16(reg : tregister) : tregister;
  271.     function reg16toreg32(reg : tregister) : tregister;
  272.  
  273.     { resets all values of ref to defaults }
  274.     procedure reset_reference(var ref : treference);
  275.  
  276.     { same as reset_reference, but symbol is disposed }
  277.     { use this only for already used references       }
  278.     procedure clear_reference(var ref : treference);
  279.  
  280.     { make l as a new label }
  281.     procedure getlabel(var l : plabel);
  282.     { frees the label if unused }
  283.     procedure freelabel(var l : plabel);
  284.     { make a new zero label }
  285.     procedure getzerolabel(var l : plabel);
  286.     { reset a label to a zero label }
  287.     procedure setzerolabel(var l : plabel);
  288.     {just get a label number }
  289.     procedure getlabelnr(var l : longint);
  290.  
  291.     function newreference(const r : treference) : preference;
  292.  
  293.     function reg2str(r : tregister) : string;
  294.  
  295.     { generates an help record for constants }
  296.     function newcsymbol(const s : string;l : longint) : pcsymbol;
  297.  
  298.     function lab2str(l : plabel) : string;
  299.  
  300.     const
  301.        ao_unknown = $0;
  302.        { 8 bit reg }
  303.        ao_reg8 = $1;
  304.        { 16 bit reg }
  305.        ao_reg16 = $2;
  306.        { 32 bit reg }
  307.        ao_reg32 = $4;
  308.        ao_reg = (ao_reg8 or ao_reg16 or ao_reg32);
  309.  
  310.        { for  push/pop operands }
  311.        ao_wordreg = (ao_reg16 or ao_reg32);
  312.        ao_imm8 = $8;        { 8 bit immediate }
  313.        ao_imm8S   = $10;        { 8 bit immediate sign extended }
  314.        ao_imm16   = $20;        { 16 bit immediate }
  315.        ao_imm32   = $40;        { 32 bit immediate }
  316.        ao_imm1    = $80;        { 1 bit immediate }
  317.  
  318.        { for  unknown expressions }
  319.        ao_immunknown = ao_imm32;
  320.  
  321.        { gen'l immediate }
  322.        ao_imm = (ao_imm8 or ao_imm8S or ao_imm16 or ao_imm32);
  323.        ao_disp8   = $200;       { 8 bit displacement (for  jumps) }
  324.        ao_disp16  = $400;       { 16 bit displacement }
  325.        ao_disp32  = $800;       { 32 bit displacement }
  326.  
  327.        { general displacement }
  328.        ao_disp    = (ao_disp8 or ao_disp16 or ao_disp32);
  329.  
  330.        { for  unknown size displacements }
  331.        ao_dispunknown = ao_disp32;
  332.        ao_mem8    = $1000;
  333.        ao_mem16   = $2000;
  334.        ao_mem32   = $4000;
  335.        ao_baseindex = $8000;
  336.  
  337.        { general mem }
  338.        ao_mem     = (ao_disp or ao_mem8 or ao_mem16 or ao_mem32 or ao_baseindex);
  339.        ao_wordmem = (ao_mem16 or ao_mem32 or ao_disp or ao_baseindex);
  340.        ao_bytemem = (ao_mem8 or ao_disp or ao_baseindex);
  341.  
  342.        { register to hold in/out port addr = dx }
  343.        ao_inoutportreg = $10000;
  344.        { register to hold shift cound = cl }
  345.        ao_shiftcount = $20000;
  346.        ao_control = $40000; { Control register }
  347.        ao_debug   = $80000; { Debug register }
  348.        ao_test    = $100000;    { Test register }
  349.  
  350.        { suggestion from PM }
  351.        { st0 is also a float reg }
  352.  
  353.        {ao_floatreg = $200000;  }{ Float register }
  354.        ao_otherfloatreg = $200000;  { Float register different from st0 }
  355.        ao_floatacc = $400000;   { Float stack top %st(0) }
  356.        ao_floatreg = ao_otherfloatreg or ao_floatacc; { all float regs }
  357.  
  358.        { Florian correct this if it is wrong
  359.          but it seems necessary for ratti386 to accept the code
  360.          in i386/math.inc !! }
  361.  
  362.        { 2 bit segment register }
  363.        ao_sreg2   = $800000;
  364.  
  365.        { 3 bit segment register }
  366.        ao_sreg3   = $1000000;
  367.  
  368.        { Accumulat or  %al  or  %ax  or  %eax }
  369.        ao_acc  = $2000000;
  370.        ao_implicitregister = (ao_inoutportreg or ao_shiftcount or ao_acc or ao_floatacc);
  371.        ao_jumpabsolute = $4000000;
  372.        ao_abs8 = $08000000;
  373.        ao_abs16 = $10000000;
  374.        ao_abs32 = $20000000;
  375.        ao_abs = (ao_abs8 or ao_abs16 or ao_abs32);
  376.  
  377.        ao_none = $ff;
  378.  
  379.  
  380.        { this is for the code generator }
  381.        { set if operands are words or dwords }
  382.        af_w       = $1;
  383.        { D = 0 if Reg --> Regmem; D = 1 if Regmem --> Reg }
  384.        af_d        = $2;
  385.        { direction flag for floating insns:  MUST BE = $400 }
  386.        af_floatd = $400;
  387.        { shorthand }
  388.        af_dw = (af_d or af_w);
  389.        { register is in low 3 bits of opcode }
  390.        shortform = $10;
  391.        { shortform and w-bit is=$8 }
  392.        Shortformw = $20;
  393.        seg2shortform = $40; { encoding of load segment reg insns }
  394.        seg3shortform = $80; { fs/gs segment register insns. }
  395.        jump = $100;     { special case for jump insns. }
  396.        jumpintersegment = $200; { special case for intersegment leaps/calls }
  397.        dont_use = $400;
  398.        noModrm = $800;
  399.        modrm = $1000;
  400.        imulkludge = $2000;
  401.        Jumpbyte = $4000;
  402.        Jumpdword = $8000;
  403.        af_ReverseRegRegmem = $10000;
  404.  
  405.     type
  406.        ttemplate = record
  407.           i : tasmop;
  408.           ops : byte;
  409.           oc : longint;
  410.           eb : byte;
  411.           m : longint;
  412.           o1,o2,o3 : longint;
  413.        end;
  414.  
  415.        tins_cache = array[A_MOV..A_POPFD] of longint;
  416.  
  417.     var
  418.        ins_cache : tins_cache;
  419.        exprasmlist : paasmoutput;
  420.  
  421.     const
  422.        it : array[0..440] of ttemplate = (
  423.          (i : A_MOV;ops : 2;oc : $a0;eb : ao_none;m : af_dw or NoModrm;o1 : ao_disp32;o2 : ao_acc;o3 : 0 ),
  424.          (i : A_MOV;ops : 2;oc : $88;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0 ),
  425.          (i : A_MOV;ops : 2;oc : $b0;eb : ao_none;m : ShortFormW;o1 : ao_imm;o2 : ao_reg;o3 : 0 ),
  426.          (i : A_MOV;ops : 2;oc : $c6;eb : ao_none;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0 ),
  427.          (i : A_MOV;ops : 2;oc : $8c;eb : ao_none;m : af_d or Modrm;o1 : ao_sreg3 or ao_sreg2;o2 : ao_reg16 or
  428.            ao_mem16;o3 : 0 ),
  429.          (i : A_MOV;ops : 2;oc : $0f20;eb : ao_none;m : af_d or Modrm;o1 : ao_control;o2 : ao_reg32;o3 : 0),
  430.          (i : A_MOV;ops : 2;oc : $0f21;eb : ao_none;m : af_d or Modrm;o1 : ao_debug;o2 : ao_reg32;o3 : 0),
  431.          (i : A_MOV;ops : 2;oc : $0f24;eb : ao_none;m : af_d or Modrm;o1 : ao_test;o2 : ao_reg32;o3 : 0),
  432.          (i : A_MOVSB;ops : 2;oc : $0fbe;eb : ao_none;m : af_reverseregregmem or Modrm;o1 : ao_reg8 or ao_mem;o2 : ao_reg16
  433.            or ao_reg32;o3 : 0),
  434.          (i : A_MOVSBL;ops : 2;oc : $0fbe;eb : ao_none;m : af_reverseregregmem or Modrm;o1 : ao_reg8 or ao_mem;
  435.            o2 : ao_reg32;o3 : 0),
  436.          (i : A_MOVSBW;ops : 2;oc : $660fbe;eb : ao_none;m : af_reverseregregmem or Modrm;o1 : ao_reg8 or ao_mem;
  437.            o2 : ao_reg16;o3 : 0),
  438.          (i : A_MOVSWL;ops : 2;oc : $0fbf;eb : ao_none;m : af_reverseregregmem or Modrm;o1 : ao_reg16 or ao_mem;
  439.            o2 : ao_reg32;o3 : 0),
  440.          (i : A_MOVZB;ops : 2;oc : $0fb6;eb : ao_none;m : af_reverseregregmem or Modrm;o1 : ao_reg8 or ao_mem;
  441.            o2 : ao_reg16 or ao_reg32;o3 : 0),
  442.          (i : A_MOVZWL;ops : 2;oc : $0fb7;eb : ao_none;m : af_reverseregregmem or Modrm;o1 : ao_reg16 or ao_mem;
  443.            o2 : ao_reg32;o3 : 0),
  444.          (i : A_PUSH;ops : 1;oc : $50;eb : ao_none;m : ShortForm;o1 : ao_wordreg;o2 : 0;o3 : 0 ),
  445.          (i : A_PUSH;ops : 1;oc : $ff;eb : $6;m : Modrm;o1 : ao_wordreg or ao_wordMem;o2 : 0;o3 : 0 ),
  446.          (i : A_PUSH;ops : 1;oc : $6a;eb : ao_none;m : NoModrm;o1 : ao_imm8S;o2 : 0;o3 : 0),
  447.          (i : A_PUSH;ops : 1;oc : $68;eb : ao_none;m : NoModrm;o1 : ao_imm32 or ao_imm16;o2 : 0;o3 : 0),
  448.          (i : A_PUSH;ops : 1;oc : $06;eb : ao_none;m : Seg2ShortForm;o1 : ao_sreg2;o2 : 0;o3 : 0 ),
  449.          (i : A_PUSH;ops : 1;oc : $0fa0;eb : ao_none;m : Seg3ShortForm;o1 : ao_sreg3;o2 : 0;o3 : 0 ),
  450.          (i : A_PUSHA;ops : 0;oc : $60;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0 ),
  451.          (i : A_PUSHAD; ops: 0; oc: $6660;eb: ao_none;m: NoModRm;o1:   0;o2:  0;o3:  0 ),
  452.          (i : A_POP;ops : 1;oc : $58;eb : ao_none;m : ShortForm;o1 : ao_wordreg;o2 : 0;o3 : 0 ),
  453.          (i : A_POP;ops : 1;oc : $8f;eb : $0;m : Modrm;o1 : ao_wordreg or ao_wordmem;o2 : 0;o3 : 0 ),
  454.          (i : A_POP;ops : 1;oc : $07;eb : ao_none;m : Seg2ShortForm;o1 : ao_sreg2;o2 : 0;o3 : 0 ),
  455.          (i : A_POP;ops : 1;oc : $0fa1;eb : ao_none;m : Seg3ShortForm;o1 : ao_sreg3;o2 : 0;o3 : 0 ),
  456.          (i : A_POPA;ops : 0;oc : $61;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0 ),
  457.          (i : A_POPAD; ops: 0; oc: $6661;eb: ao_none;m : NoModRm;o1 : 0;o2 : 0;o3: 0),
  458.          (i : A_XCHG;ops : 2;oc : $90;eb : ao_none;m : ShortForm;o1 : ao_wordreg;o2 : ao_acc;o3 : 0 ),
  459.          (i : A_XCHG;ops : 2;oc : $90;eb : ao_none;m : ShortForm;o1 : ao_acc;o2 : ao_wordreg;o3 : 0 ),
  460.          (i : A_XCHG;ops : 2;oc : $86;eb : ao_none;m : af_w or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0 ),
  461.          (i : A_XCHG;ops : 2;oc : $86;eb : ao_none;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : ao_reg;o3 : 0 ),
  462.          (i : A_IN;ops : 2;oc : $e4;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm8;o2 : ao_acc;o3 : 0 ),
  463.          (i : A_IN;ops : 2;oc : $ec;eb : ao_none;m : af_w or NoModrm;o1 : ao_inoutportreg;o2 : ao_acc;o3 : 0 ),
  464.          (i : A_OUT;ops : 2;oc : $e6;eb : ao_none;m : af_w or NoModrm;o1 : ao_acc;o2 : ao_imm8;o3 : 0 ),
  465.          (i : A_OUT;ops : 2;oc : $ee;eb : ao_none;m : af_w or NoModrm;o1 : ao_acc;o2 : ao_inoutportreg;o3 : 0 ),
  466.          (i : A_LEA;ops : 2;oc : $8d;eb : ao_none;m : Modrm;o1 : ao_wordmem;o2 : ao_wordreg;o3 : 0 ),
  467.          (i : A_LDS;ops : 2;oc : $c5;eb : ao_none;m : Modrm;o1 : ao_mem;o2 : ao_reg32;o3 : 0),
  468.          (i : A_LES;ops : 2;oc : $c4;eb : ao_none;m : Modrm;o1 : ao_mem;o2 : ao_reg32;o3 : 0),
  469.          (i : A_LFS;ops : 2;oc : $0fb4;eb : ao_none;m : Modrm;o1 : ao_mem;o2 : ao_reg32;o3 : 0),
  470.          (i : A_LGS;ops : 2;oc : $0fb5;eb : ao_none;m : Modrm;o1 : ao_mem;o2 : ao_reg32;o3 : 0),
  471.          (i : A_LSS;ops : 2;oc : $0fb2;eb : ao_none;m : Modrm;o1 : ao_mem;o2 : ao_reg32;o3 : 0),
  472.          (i : A_CLC;ops : 0;oc : $f8;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  473.          (i : A_CLD;ops : 0;oc : $fc;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  474.          (i : A_CLI;ops : 0;oc : $fa;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  475.          (i : A_CLTS;ops : 0;oc : $0f06;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  476.          (i : A_CMC;ops : 0;oc : $f5;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  477.          (i : A_LAHF;ops : 0;oc : $9f;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  478.          (i : A_SAHF;ops : 0;oc : $9e;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  479.          (i : A_PUSHF;ops : 0;oc : $9c;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  480.          (i : A_PUSHFD; ops: 0; oc: $669c; eb: ao_none; m: NoModRm; o1: 0;o2: 0;o3: 0),
  481.          (i : A_POPF;ops : 0;oc : $9d;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  482.          (i : A_POPFD;ops: 0;oc:  $669d;eb : ao_none;m : NoModRm;o1:  0;o2 : 0;o3 : 0),
  483.          (i : A_STC;ops : 0;oc : $f9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  484.          (i : A_STD;ops : 0;oc : $fd;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  485.          (i : A_STI;ops : 0;oc : $fb;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  486.          (i : A_ADD;ops : 2;oc : $0;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  487.          (i : A_ADD;ops : 2;oc : $83;eb : 0;m : Modrm;o1 : ao_imm8s;o2 : ao_wordreg or ao_wordmem;o3 : 0),
  488.          (i : A_ADD;ops : 2;oc : $4;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  489.          (i : A_ADD;ops : 2;oc : $80;eb : 0;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  490.          (i : A_INC;ops : 1;oc : $40;eb : ao_none;m : ShortForm;o1 : ao_wordreg;o2 : 0;o3 : 0),
  491.          (i : A_INC;ops : 1;oc : $fe;eb : 0;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  492.          (i : A_SUB;ops : 2;oc : $28;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  493.          (i : A_SUB;ops : 2;oc : $83;eb : 5;m : Modrm;o1 : ao_imm8s;o2 : ao_wordreg or ao_wordmem;o3 : 0),
  494.          (i : A_SUB;ops : 2;oc : $2c;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  495.          (i : A_SUB;ops : 2;oc : $80;eb : 5;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  496.          (i : A_DEC;ops : 1;oc : $48;eb : ao_none;m : ShortForm;o1 : ao_wordreg;o2 : 0;o3 : 0),
  497.          (i : A_DEC;ops : 1;oc : $fe;eb : 1;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  498.          (i : A_SBB;ops : 2;oc : $18;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  499.          (i : A_SBB;ops : 2;oc : $83;eb : 3;m : Modrm;o1 : ao_imm8s;o2 : ao_wordreg or ao_wordmem;o3 : 0),
  500.          (i : A_SBB;ops : 2;oc : $1c;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  501.          (i : A_SBB;ops : 2;oc : $80;eb : 3;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  502.          (i : A_CMP;ops : 2;oc : $38;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  503.          (i : A_CMP;ops : 2;oc : $83;eb : 7;m : Modrm;o1 : ao_imm8s;o2 : ao_wordreg or ao_wordmem;o3 : 0),
  504.          (i : A_CMP;ops : 2;oc : $3c;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  505.          (i : A_CMP;ops : 2;oc : $80;eb : 7;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  506.          (i : A_TEST;ops : 2;oc : $84;eb : ao_none;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : ao_reg;o3 : 0),
  507.          (i : A_TEST;ops : 2;oc : $84;eb : ao_none;m : af_w or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  508.          (i : A_TEST;ops : 2;oc : $a8;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  509.          (i : A_TEST;ops : 2;oc : $f6;eb : 0;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  510.          (i : A_AND;ops : 2;oc : $20;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  511.          (i : A_AND;ops : 2;oc : $83;eb : 4;m : Modrm;o1 : ao_imm8s;o2 : ao_wordreg or ao_wordmem;o3 : 0),
  512.          (i : A_AND;ops : 2;oc : $24;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  513.          (i : A_AND;ops : 2;oc : $80;eb : 4;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  514.          (i : A_OR;ops : 2;oc : $08;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  515.          (i : A_OR;ops : 2;oc : $83;eb : 1;m : Modrm;o1 : ao_imm8s;o2 : ao_wordreg or ao_wordmem;o3 : 0),
  516.          (i : A_OR;ops : 2;oc : $0c;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  517.          (i : A_OR;ops : 2;oc : $80;eb : 1;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  518.          (i : A_XOR;ops : 2;oc : $30;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  519.          (i : A_XOR;ops : 2;oc : $83;eb : 6;m : Modrm;o1 : ao_imm8s;o2 : ao_wordreg or ao_wordmem;o3 : 0),
  520.          (i : A_XOR;ops : 2;oc : $34;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  521.          (i : A_XOR;ops : 2;oc : $80;eb : 6;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  522.          (i : A_ADC;ops : 2;oc : $10;eb : ao_none;m : af_dw or Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  523.          (i : A_ADC;ops : 2;oc : $83;eb : 2;m : Modrm;o1 : ao_imm8s;o2 : ao_wordreg or ao_wordmem;o3 : 0),
  524.          (i : A_ADC;ops : 2;oc : $14;eb : ao_none;m : af_w or NoModrm;o1 : ao_imm;o2 : ao_acc;o3 : 0),
  525.          (i : A_ADC;ops : 2;oc : $80;eb : 2;m : af_w or Modrm;o1 : ao_imm;o2 : ao_reg or ao_mem;o3 : 0),
  526.          (i : A_NEG;ops : 1;oc : $f6;eb : 3;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  527.          (i : A_NOT;ops : 1;oc : $f6;eb : 2;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  528.          (i : A_AAA;ops : 0;oc : $37;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  529.          (i : A_AAS;ops : 0;oc : $3f;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  530.          (i : A_DAA;ops : 0;oc : $27;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  531.          (i : A_DAS;ops : 0;oc : $2f;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  532.          (i : A_AAD;ops : 0;oc : $d50a;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  533.          (i : A_AAM;ops : 0;oc : $d40a;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  534.          (i : A_CBW;ops : 0;oc : $6698;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  535.          (i : A_CWD;ops : 0;oc : $6699;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  536.          (i : A_CWDE;ops : 0;oc : $98;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  537.          (i : A_CDQ;ops : 0;oc : $99;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  538.          (i : A_MUL;ops : 1;oc : $f6;eb : 4;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  539.          (i : A_IMUL;ops : 1;oc : $f6;eb : 5;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  540.          (i : A_IMUL;ops : 2;oc : $0faf;eb : ao_none;m : Modrm or af_reverseregregmem;o1 : ao_wordreg or ao_mem;
  541.            o2 : ao_wordreg;o3 : 0),
  542.          (i : A_IMUL;ops : 3;oc : $6b;eb : ao_none;m : Modrm or af_reverseregregmem;o1 : ao_imm8s;
  543.            o2 : ao_wordreg or ao_mem;o3 : ao_wordreg),
  544.          (i : A_IMUL;ops : 3;oc : $69;eb : ao_none;m : Modrm or af_reverseregregmem;o1 : ao_imm16 or ao_imm32;
  545.            o2 : ao_wordreg or ao_mem;o3 : ao_wordreg),
  546.          (i : A_IMUL;ops : 2;oc : $6b;eb : ao_none;m : Modrm or imulKludge;o1 : ao_imm8s;o2 : ao_wordreg;o3 : 0),
  547.          (i : A_IMUL;ops : 2;oc : $69;eb : ao_none;m : Modrm or imulKludge;o1 : ao_imm16 or ao_imm32;o2 : ao_wordreg;o3 : 0),
  548.          (i : A_DIV;ops : 1;oc : $f6;eb : 6;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  549.          (i : A_DIV;ops : 2;oc : $f6;eb : 6;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : ao_acc;o3 : 0),
  550.          (i : A_IDIV;ops : 1;oc : $f6;eb : 7;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  551.          (i : A_IDIV;ops : 2;oc : $f6;eb : 7;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : ao_acc;o3 : 0),
  552.          (i : A_ROL;ops : 2;oc : $d0;eb : 0;m : af_w or Modrm;o1 : ao_imm1;o2 : ao_reg or ao_mem;o3 : 0),
  553.          (i : A_ROL;ops : 2;oc : $c0;eb : 0;m : af_w or Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  554.          (i : A_ROL;ops : 2;oc : $d2;eb : 0;m : af_w or Modrm;o1 : ao_shiftcount;o2 : ao_reg or ao_mem;o3 : 0),
  555.          (i : A_ROL;ops : 1;oc : $d0;eb : 0;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  556.          (i : A_ROR;ops : 2;oc : $d0;eb : 1;m : af_w or Modrm;o1 : ao_imm1;o2 : ao_reg or ao_mem;o3 : 0),
  557.          (i : A_ROR;ops : 2;oc : $c0;eb : 1;m : af_w or Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  558.          (i : A_ROR;ops : 2;oc : $d2;eb : 1;m : af_w or Modrm;o1 : ao_shiftcount;o2 : ao_reg or ao_mem;o3 : 0),
  559.          (i : A_ROR;ops : 1;oc : $d0;eb : 1;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  560.          (i : A_RCL;ops : 2;oc : $d0;eb : 2;m : af_w or Modrm;o1 : ao_imm1;o2 : ao_reg or ao_mem;o3 : 0),
  561.          (i : A_RCL;ops : 2;oc : $c0;eb : 2;m : af_w or Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  562.          (i : A_RCL;ops : 2;oc : $d2;eb : 2;m : af_w or Modrm;o1 : ao_shiftcount;o2 : ao_reg or ao_mem;o3 : 0),
  563.          (i : A_RCL;ops : 1;oc : $d0;eb : 2;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  564.          (i : A_RCR;ops : 2;oc : $d0;eb : 3;m : af_w or Modrm;o1 : ao_imm1;o2 : ao_reg or ao_mem;o3 : 0),
  565.          (i : A_RCR;ops : 2;oc : $c0;eb : 3;m : af_w or Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  566.          (i : A_RCR;ops : 2;oc : $d2;eb : 3;m : af_w or Modrm;o1 : ao_shiftcount;o2 : ao_reg or ao_mem;o3 : 0),
  567.          (i : A_RCR;ops : 1;oc : $d0;eb : 3;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  568.          (i : A_SAL;ops : 2;oc : $d0;eb : 4;m : af_w or Modrm;o1 : ao_imm1;o2 : ao_reg or ao_mem;o3 : 0),
  569.          (i : A_SAL;ops : 2;oc : $c0;eb : 4;m : af_w or Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  570.          (i : A_SAL;ops : 2;oc : $d2;eb : 4;m : af_w or Modrm;o1 : ao_shiftcount;o2 : ao_reg or ao_mem;o3 : 0),
  571.          (i : A_SAL;ops : 1;oc : $d0;eb : 4;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  572.          (i : A_SHL;ops : 2;oc : $d0;eb : 4;m : af_w or Modrm;o1 : ao_imm1;o2 : ao_reg or ao_mem;o3 : 0),
  573.          (i : A_SHL;ops : 2;oc : $c0;eb : 4;m : af_w or Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  574.          (i : A_SHL;ops : 2;oc : $d2;eb : 4;m : af_w or Modrm;o1 : ao_shiftcount;o2 : ao_reg or ao_mem;o3 : 0),
  575.          (i : A_SHL;ops : 1;oc : $d0;eb : 4;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  576.          (i : A_SHLD;ops : 3;oc : $0fa4;eb : ao_none;m : Modrm;o1 : ao_imm8;o2 : ao_wordreg;o3 : ao_wordreg or ao_mem),
  577.          (i : A_SHLD;ops : 3;oc : $0fa5;eb : ao_none;m : Modrm;o1 : ao_shiftcount;o2 : ao_wordreg;o3 : ao_wordreg or ao_mem),
  578.          (i : A_SHR;ops : 2;oc : $d0;eb : 5;m : af_w or Modrm;o1 : ao_imm1;o2 : ao_reg or ao_mem;o3 : 0),
  579.          (i : A_SHR;ops : 2;oc : $c0;eb : 5;m : af_w or Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  580.          (i : A_SHR;ops : 2;oc : $d2;eb : 5;m : af_w or Modrm;o1 : ao_shiftcount;o2 : ao_reg or ao_mem;o3 : 0),
  581.          (i : A_SHR;ops : 1;oc : $d0;eb : 5;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  582.          (i : A_SHRD;ops : 3;oc : $0fac;eb : ao_none;m : Modrm;o1 : ao_imm8;o2 : ao_wordreg;o3 : ao_wordreg or ao_mem),
  583.          (i : A_SHRD;ops : 3;oc : $0fad;eb : ao_none;m : Modrm;o1 : ao_shiftcount;o2 : ao_wordreg;o3 : ao_wordreg or ao_mem),
  584.          (i : A_SAR;ops : 2;oc : $d0;eb : 7;m : af_w or Modrm;o1 : ao_imm1;o2 : ao_reg or ao_mem;o3 : 0),
  585.          (i : A_SAR;ops : 2;oc : $c0;eb : 7;m : af_w or Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  586.          (i : A_SAR;ops : 2;oc : $d2;eb : 7;m : af_w or Modrm;o1 : ao_shiftcount;o2 : ao_reg or ao_mem;o3 : 0),
  587.          (i : A_SAR;ops : 1;oc : $d0;eb : 7;m : af_w or Modrm;o1 : ao_reg or ao_mem;o2 : 0;o3 : 0),
  588.          (i : A_CALL;ops : 1;oc : $e8;eb : ao_none;m : jumpdword;o1 : ao_disp32;o2 : 0;o3 : 0),
  589.          (i : A_CALL;ops : 1;oc : $ff;eb : 2;m : Modrm;o1 : ao_reg or ao_mem or ao_jumpabsolute;o2 : 0;o3 : 0),
  590.          (i : A_LCALL;ops : 2;oc : $9a;eb : ao_none;m : JumpInterSegment;o1 : ao_imm16;o2 : ao_abs32;o3 : 0),
  591.          (i : A_LCALL;ops : 1;oc : $ff;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  592.          (i : A_JMP;ops : 1;oc : $eb;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  593.          (i : A_JMP;ops : 1;oc : $ff;eb : 4;m : Modrm;o1 : ao_reg32 or ao_mem or ao_jumpabsolute;o2 : 0;o3 : 0),
  594.          (i : A_LJMP;ops : 2;oc : $ea;eb : ao_none;m : JumpInterSegment;o1 : ao_imm16;o2 : ao_imm32;o3 : 0),
  595.          (i : A_LJMP;ops : 1;oc : $ff;eb : 5;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  596.          (i : A_RET;ops : 0;oc : $c3;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  597.          (i : A_RET;ops : 1;oc : $c2;eb : ao_none;m : NoModrm;o1 : ao_imm16;o2 : 0;o3 : 0),
  598.          (i : A_LRET;ops : 0;oc : $cb;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  599.          (i : A_LRET;ops : 1;oc : $ca;eb : ao_none;m : NoModrm;o1 : ao_imm16;o2 : 0;o3 : 0),
  600.          (i : A_ENTER;ops : 2;oc : $c8;eb : ao_none;m : NoModrm;o1 : ao_imm16;o2 : ao_imm8;o3 : 0),
  601.          (i : A_LEAVE;ops : 0;oc : $c9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  602.          (i : A_JO;ops : 1;oc : $70;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  603.          (i : A_JNO;ops : 1;oc : $71;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  604.          (i : A_JB;ops : 1;oc : $72;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  605.          (i : A_JC;ops : 1;oc : $72;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  606.          (i : A_JNAE;ops : 1;oc : $72;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  607.          (i : A_JNB;ops : 1;oc : $73;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  608.          (i : A_JNC;ops : 1;oc : $73;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  609.          (i : A_JAE;ops : 1;oc : $73;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  610.          (i : A_JE;ops : 1;oc : $74;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  611.          (i : A_JZ;ops : 1;oc : $74;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  612.          (i : A_JNE;ops : 1;oc : $75;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  613.          (i : A_JNZ;ops : 1;oc : $75;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  614.          (i : A_JBE;ops : 1;oc : $76;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  615.          (i : A_JNA;ops : 1;oc : $76;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  616.          (i : A_JNBE;ops : 1;oc : $77;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  617.          (i : A_JA;ops : 1;oc : $77;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  618.          (i : A_JS;ops : 1;oc : $78;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  619.          (i : A_JNS;ops : 1;oc : $79;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  620.          (i : A_JP;ops : 1;oc : $7a;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  621.          (i : A_JPE;ops : 1;oc : $7a;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  622.          (i : A_JNP;ops : 1;oc : $7b;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  623.          (i : A_JPO;ops : 1;oc : $7b;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  624.          (i : A_JL;ops : 1;oc : $7c;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  625.          (i : A_JNGE;ops : 1;oc : $7c;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  626.          (i : A_JNL;ops : 1;oc : $7d;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  627.          (i : A_JGE;ops : 1;oc : $7d;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  628.          (i : A_JLE;ops : 1;oc : $7e;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  629.          (i : A_JNG;ops : 1;oc : $7e;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  630.          (i : A_JNLE;ops : 1;oc : $7f;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  631.          (i : A_JG;ops : 1;oc : $7f;eb : ao_none;m : Jump;o1 : ao_disp;o2 : 0;o3 : 0),
  632.          (i : A_JCXZ;ops : 1;oc : $67e3;eb : ao_none;m : JumpByte;o1 : ao_disp;o2 : 0;o3 : 0),
  633.          (i : A_JECXZ;ops : 1;oc : $e3;eb : ao_none;m : JumpByte;o1 : ao_disp;o2 : 0;o3 : 0),
  634.          (i : A_LOOP;ops : 1;oc : $e2;eb : ao_none;m : JumpByte;o1 : ao_disp;o2 : 0;o3 : 0),
  635.          (i : A_LOOPZ;ops : 1;oc : $e1;eb : ao_none;m : JumpByte;o1 : ao_disp;o2 : 0;o3 : 0),
  636.          (i : A_LOOPE;ops : 1;oc : $e1;eb : ao_none;m : JumpByte;o1 : ao_disp;o2 : 0;o3 : 0),
  637.          (i : A_LOOPNZ;ops : 1;oc : $e0;eb : ao_none;m : JumpByte;o1 : ao_disp;o2 : 0;o3 : 0),
  638.          (i : A_LOOPNE;ops : 1;oc : $e0;eb : ao_none;m : JumpByte;o1 : ao_disp;o2 : 0;o3 : 0),
  639.          (i : A_SETO;ops : 1;oc : $0f90;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  640.          (i : A_SETNO;ops : 1;oc : $0f91;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  641.          (i : A_SETB;ops : 1;oc : $0f92;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  642.          (i : A_SETNAE;ops : 1;oc : $0f92;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  643.          (i : A_SETNB;ops : 1;oc : $0f93;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  644.          (i : A_SETAE;ops : 1;oc : $0f93;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  645.          (i : A_SETE;ops : 1;oc : $0f94;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  646.          (i : A_SETZ;ops : 1;oc : $0f94;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  647.          (i : A_SETNE;ops : 1;oc : $0f95;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  648.          (i : A_SETNZ;ops : 1;oc : $0f95;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  649.          (i : A_SETBE;ops : 1;oc : $0f96;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  650.          (i : A_SETNA;ops : 1;oc : $0f96;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  651.          (i : A_SETNBE;ops : 1;oc : $0f97;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  652.          (i : A_SETA;ops : 1;oc : $0f97;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  653.          (i : A_SETS;ops : 1;oc : $0f98;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  654.          (i : A_SETNS;ops : 1;oc : $0f99;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  655.          (i : A_SETP;ops : 1;oc : $0f9a;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  656.          (i : A_SETC;ops : 1; oc: $0f92;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  657.          (i : A_SETNC;ops : 1;oc: $0f93;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  658.          (i : A_SETPE;ops : 1;oc : $0f9a;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  659.          (i : A_SETNP;ops : 1;oc : $0f9b;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  660.          (i : A_SETPO;ops : 1;oc : $0f9b;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  661.          (i : A_SETL;ops : 1;oc : $0f9c;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  662.          (i : A_SETNGE;ops : 1;oc : $0f9c;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  663.          (i : A_SETNL;ops : 1;oc : $0f9d;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  664.          (i : A_SETGE;ops : 1;oc : $0f9d;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  665.          (i : A_SETLE;ops : 1;oc : $0f9e;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  666.          (i : A_SETNG;ops : 1;oc : $0f9e;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  667.          (i : A_SETNLE;ops : 1;oc : $0f9f;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  668.          (i : A_SETG;ops : 1;oc : $0f9f;eb : 0;m : Modrm;o1 : ao_reg8 or ao_mem;o2 : 0;o3 : 0),
  669.          (i : A_CMPS;ops : 0;oc : $a6;eb : ao_none;m : af_w or NoModrm;o1 : 0;o2 : 0;o3 : 0),
  670.          (i : A_INS;ops : 0;oc : $6c;eb : ao_none;m : af_w or NoModrm;o1 : 0;o2 : 0;o3 : 0),
  671.          (i : A_OUTS;ops : 0;oc : $6e;eb : ao_none;m : af_w or NoModrm;o1 : 0;o2 : 0;o3 : 0),
  672.          (i : A_LODS;ops : 0;oc : $ac;eb : ao_none;m : af_w or NoModrm;o1 : 0;o2 : 0;o3 : 0),
  673.          (i : A_MOVS;ops : 0;oc : $a4;eb : ao_none;m : af_w or NoModrm;o1 : 0;o2 : 0;o3 : 0),
  674.          (i : A_SCAS;ops : 0;oc : $ae;eb : ao_none;m : af_w or NoModrm;o1 : 0;o2 : 0;o3 : 0),
  675.          (i : A_STOS;ops : 0;oc : $aa;eb : ao_none;m : af_w or NoModrm;o1 : 0;o2 : 0;o3 : 0),
  676.          (i : A_XLAT;ops : 0;oc : $d7;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  677.          (i : A_BSF;ops : 2;oc : $0fbc;eb : ao_none;m : Modrm or af_reverseregregmem;o1 : ao_reg or ao_mem;o2 : ao_reg;o3 : 0),
  678.          (i : A_BSR;ops : 2;oc : $0fbd;eb : ao_none;m : Modrm or af_reverseregregmem;o1 : ao_reg or ao_mem;o2 : ao_reg;o3 : 0),
  679.          (i : A_BT;ops : 2;oc : $0fa3;eb : ao_none;m : Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  680.          (i : A_BT;ops : 2;oc : $0fba;eb : 4;m : Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  681.          (i : A_BTC;ops : 2;oc : $0fbb;eb : ao_none;m : Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  682.          (i : A_BTC;ops : 2;oc : $0fba;eb : 7;m : Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  683.          (i : A_BTR;ops : 2;oc : $0fb3;eb : ao_none;m : Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  684.          (i : A_BTR;ops : 2;oc : $0fba;eb : 6;m : Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  685.          (i : A_BTS;ops : 2;oc : $0fab;eb : ao_none;m : Modrm;o1 : ao_reg;o2 : ao_reg or ao_mem;o3 : 0),
  686.          (i : A_BTS;ops : 2;oc : $0fba;eb : 5;m : Modrm;o1 : ao_imm8;o2 : ao_reg or ao_mem;o3 : 0),
  687.          (i : A_INT;ops : 1;oc : $cd;eb : ao_none;m : NoModrm;o1 : ao_imm8;o2 : 0;o3 : 0),
  688.          (i : A_INT3;ops : 0;oc : $cc;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  689.          (i : A_INTO;ops : 0;oc : $ce;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  690.          (i : A_IRET;ops : 0;oc : $cf;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  691.          (i : A_BOUNDL;ops : 2;oc : $62;eb : ao_none;m : Modrm;o1 : ao_reg32;o2 : ao_mem;o3 : 0),
  692.          (i : A_BOUNDW;ops : 2;oc : $6662;eb : ao_none;m : Modrm;o1 : ao_reg16;o2 : ao_mem;o3 : 0),
  693.          (i : A_HLT;ops : 0;oc : $f4;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  694.          (i : A_wAIT;ops : 0;oc : $9b;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  695.          (i : A_NOP;ops : 0;oc : $90;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  696.          (i : A_ARPL;ops : 2;oc : $63;eb : ao_none;m : Modrm;o1 : ao_reg16;o2 : ao_reg16 or ao_mem;o3 : 0),
  697.          (i : A_LAR;ops : 2;oc : $0f02;eb : ao_none;m : Modrm or af_reverseregregmem;o1 : ao_wordreg or ao_mem;
  698.            o2 : ao_wordreg;o3 : 0),
  699.          (i : A_LGDT;ops : 1;oc : $0f01;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  700.          (i : A_LIDT;ops : 1;oc : $0f01;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  701.          (i : A_LLDT;ops : 1;oc : $0f00;eb : 2;m : Modrm;o1 : ao_wordreg or ao_mem;o2 : 0;o3 : 0),
  702.          (i : A_LMSW;ops : 1;oc : $0f01;eb : 6;m : Modrm;o1 : ao_wordreg or ao_mem;o2 : 0;o3 : 0),
  703.          (i : A_LSL;ops : 2;oc : $0f03;eb : ao_none;m : Modrm or af_reverseregregmem;o1 : ao_wordreg or ao_mem;
  704.            o2 : ao_wordreg;o3 : 0),
  705.          (i : A_LTR;ops : 1;oc : $0f00;eb : 3;m : Modrm;o1 : ao_wordreg or ao_mem;o2 : 0;o3 : 0),
  706.          (i : A_SGDT;ops : 1;oc : $0f01;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  707.          (i : A_SIDT;ops : 1;oc : $0f01;eb : 1;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  708.          (i : A_SLDT;ops : 1;oc : $0f00;eb : 0;m : Modrm;o1 : ao_wordreg or ao_mem;o2 : 0;o3 : 0),
  709.          (i : A_SMSW;ops : 1;oc : $0f01;eb : 4;m : Modrm;o1 : ao_wordreg or ao_mem;o2 : 0;o3 : 0),
  710.          (i : A_STR;ops : 1;oc : $0f00;eb : 1;m : Modrm;o1 : ao_reg16 or ao_mem;o2 : 0;o3 : 0),
  711.          (i : A_VERR;ops : 1;oc : $0f00;eb : 4;m : Modrm;o1 : ao_wordreg or ao_mem;o2 : 0;o3 : 0),
  712.          (i : A_VERW;ops : 1;oc : $0f00;eb : 5;m : Modrm;o1 : ao_wordreg or ao_mem;o2 : 0;o3 : 0),
  713.          (i : A_FLD;ops : 1;oc : $d9c0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  714.          (i : A_FLDS;ops : 1;oc : $d9;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  715.          (i : A_FILDL;ops : 1;oc : $db;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  716.          (i : A_FLDL;ops : 1;oc : $dd;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  717.          (i : A_FLDL;ops : 1;oc : $d9c0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  718.          (i : A_FILDS;ops : 1;oc : $df;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  719.          (i : A_FILDQ;ops : 1;oc : $df;eb : 5;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  720.          (i : A_FLDT;ops : 1;oc : $db;eb : 5;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  721.          (i : A_FBLD;ops : 1;oc : $df;eb : 4;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  722.          (i : A_FST;ops : 1;oc : $ddd0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  723.          (i : A_FSTS;ops : 1;oc : $d9;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  724.          (i : A_FISTL;ops : 1;oc : $db;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  725.          (i : A_FSTL;ops : 1;oc : $dd;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  726.          (i : A_FSTL;ops : 1;oc : $ddd0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  727.          (i : A_FISTS;ops : 1;oc : $df;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  728.          (i : A_FSTP;ops : 1;oc : $ddd8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  729.          (i : A_FSTPS;ops : 1;oc : $d9;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  730.          (i : A_FISTPL;ops : 1;oc : $db;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  731.          (i : A_FSTPL;ops : 1;oc : $dd;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  732.          (i : A_FSTPL;ops : 1;oc : $ddd8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  733.          (i : A_FISTPS;ops : 1;oc : $df;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  734.          (i : A_FISTPQ;ops : 1;oc : $df;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  735.          (i : A_FSTPT;ops : 1;oc : $db;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  736.          (i : A_FBSTP;ops : 1;oc : $df;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  737.          (i : A_FXCH;ops : 1;oc : $d9c8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  738.          (i : A_FCOM;ops : 1;oc : $d8d0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  739.          (i : A_FCOMS;ops : 1;oc : $d8;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  740.          (i : A_FICOML;ops : 1;oc : $da;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  741.          (i : A_FCOML;ops : 1;oc : $dc;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  742.          (i : A_FCOML;ops : 1;oc : $d8d0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  743.          (i : A_FICOMS;ops : 1;oc : $de;eb : 2;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  744.          (i : A_FCOMP;ops : 1;oc : $d8d8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  745.          (i : A_FCOMPS;ops : 1;oc : $d8;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  746.          (i : A_FICOMPL;ops : 1;oc : $da;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  747.          (i : A_FCOMPL;ops : 1;oc : $dc;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  748.          (i : A_FCOMPL;ops : 1;oc : $d8d8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  749.          (i : A_FICOMPS;ops : 1;oc : $de;eb : 3;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  750.          (i : A_FCOMPP;ops : 0;oc : $ded9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  751.          (i : A_FUCOM;ops : 1;oc : $dde0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  752.          (i : A_FUCOMP;ops : 1;oc : $dde8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  753.          (i : A_FUCOMPP;ops : 0;oc : $dae9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  754.          (i : A_FTST;ops : 0;oc : $d9e4;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  755.          (i : A_FXAM;ops : 0;oc : $d9e5;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  756.          (i : A_FLD1;ops : 0;oc : $d9e8;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  757.          (i : A_FLDL2T;ops : 0;oc : $d9e9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  758.          (i : A_FLDL2E;ops : 0;oc : $d9ea;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  759.          (i : A_FLDPI;ops : 0;oc : $d9eb;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  760.          (i : A_FLDLG2;ops : 0;oc : $d9ec;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  761.          (i : A_FLDLN2;ops : 0;oc : $d9ed;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  762.          (i : A_FLDZ;ops : 0;oc : $d9ee;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  763.          (i : A_FADD;ops : 1;oc : $d8c0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  764.          (i : A_FADD;ops : 2;oc : $d8c0;eb : ao_none;m : ShortForm or af_floatd;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  765.          (i : A_FADD;ops : 0;oc : $dcc1;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  766.          (i : A_FADDP;ops : 1;oc : $dac0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  767.          (i : A_FADDP;ops : 2;oc : $dac0;eb : ao_none;m : ShortForm or af_floatd;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  768.          (i : A_FADDP;ops : 0;oc : $dec1;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  769.          (i : A_FADDS;ops : 1;oc : $d8;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  770.          (i : A_FIADDL;ops : 1;oc : $da;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  771.          (i : A_FADDL;ops : 1;oc : $dc;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  772.          (i : A_FIADDS;ops : 1;oc : $de;eb : 0;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  773.          (i : A_FSUB;ops : 1;oc : $d8e0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  774.          (i : A_FSUB;ops : 2;oc : $d8e0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  775.          (i : A_FSUB;ops : 2;oc : $dce8;eb : ao_none;m : ShortForm;o1 : ao_floatacc;o2 : ao_floatreg;o3 : 0),
  776.          (i : A_FSUB;ops : 0;oc : $dce1;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  777.          (i : A_FSUBP;ops : 1;oc : $dae0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  778.          (i : A_FSUBP;ops : 2;oc : $dae0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  779.          (i : A_FSUBP;ops : 2;oc : $dee0;eb : ao_none;m : ShortForm;o1 : ao_floatacc;o2 : ao_floatreg;o3 : 0),
  780.          (i : A_FSUBP;ops : 0;oc : $dee1;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  781.          (i : A_FSUBS;ops : 1;oc : $d8;eb : 4;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  782.          (i : A_FISUBL;ops : 1;oc : $da;eb : 4;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  783.          (i : A_FSUBL;ops : 1;oc : $dc;eb : 4;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  784.          (i : A_FISUBS;ops : 1;oc : $de;eb : 4;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  785.          (i : A_FSUBR;ops : 1;oc : $d8e8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  786.          (i : A_FSUBR;ops : 2;oc : $d8e8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  787.          (i : A_FSUBR;ops : 2;oc : $dce8;eb : ao_none;m : ShortForm;o1 : ao_floatacc;o2 : ao_floatreg;o3 : 0),
  788.          (i : A_FSUBR;ops : 0;oc : $dce9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  789.          (i : A_FSUBRP;ops : 1;oc : $dae8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  790.          (i : A_FSUBRP;ops : 2;oc : $dae8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  791.          (i : A_FSUBRP;ops : 2;oc : $dee8;eb : ao_none;m : ShortForm;o1 : ao_floatacc;o2 : ao_floatreg;o3 : 0),
  792.          (i : A_FSUBRP;ops : 0;oc : $dee9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  793.          (i : A_FSUBRS;ops : 1;oc : $d8;eb : 5;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  794.          (i : A_FISUBRL;ops : 1;oc : $da;eb : 5;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  795.          (i : A_FSUBRL;ops : 1;oc : $dc;eb : 5;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  796.          (i : A_FISUBRS;ops : 1;oc : $de;eb : 5;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  797.          (i : A_FMUL;ops : 1;oc : $d8c8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  798.          (i : A_FMUL;ops : 2;oc : $d8c8;eb : ao_none;m : ShortForm or af_floatd;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  799.          (i : A_FMUL;ops : 0;oc : $dcc9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  800.          (i : A_FMULP;ops : 1;oc : $dac8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  801.          (i : A_FMULP;ops : 2;oc : $dac8;eb : ao_none;m : ShortForm or af_floatd;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  802.          (i : A_FMULP;ops : 0;oc : $dec9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  803.          (i : A_FMULS;ops : 1;oc : $d8;eb : 1;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  804.          (i : A_FIMULL;ops : 1;oc : $da;eb : 1;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  805.          (i : A_FMULL;ops : 1;oc : $dc;eb : 1;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  806.          (i : A_FIMULS;ops : 1;oc : $de;eb : 1;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  807.          (i : A_FDIV;ops : 1;oc : $d8f0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  808.          (i : A_FDIV;ops : 2;oc : $d8f0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  809.          (i : A_FDIV;ops : 2;oc : $dcf0;eb : ao_none;m : ShortForm;o1 : ao_floatacc;o2 : ao_floatreg;o3 : 0),
  810.          (i : A_FDIV;ops : 0;oc : $dcf1;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  811.          (i : A_FDIVP;ops : 1;oc : $daf0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  812.          (i : A_FDIVP;ops : 2;oc : $daf0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  813.          (i : A_FDIVP;ops : 2;oc : $def0;eb : ao_none;m : ShortForm;o1 : ao_floatacc;o2 : ao_floatreg;o3 : 0),
  814.          (i : A_FDIVP;ops : 0;oc : $def1;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  815.          (i : A_FDIVS;ops : 1;oc : $d8;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  816.          (i : A_FIDIVL;ops : 1;oc : $da;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  817.          (i : A_FDIVL;ops : 1;oc : $dc;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  818.          (i : A_FIDIVS;ops : 1;oc : $de;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  819.          (i : A_FDIVR;ops : 1;oc : $d8f8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  820.          (i : A_FDIVR;ops : 2;oc : $d8f8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  821.          (i : A_FDIVR;ops : 2;oc : $dcf8;eb : ao_none;m : ShortForm;o1 : ao_floatacc;o2 : ao_floatreg;o3 : 0),
  822.          (i : A_FDIVR;ops : 0;oc : $dcf9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  823.          (i : A_FDIVRP;ops : 1;oc : $daf8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  824.          (i : A_FDIVRP;ops : 2;oc : $daf8;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : ao_floatacc;o3 : 0),
  825.          (i : A_FDIVRP;ops : 2;oc : $def8;eb : ao_none;m : ShortForm;o1 : ao_floatacc;o2 : ao_floatreg;o3 : 0),
  826.          (i : A_FDIVRP;ops : 0;oc : $def9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  827.          (i : A_FDIVRS;ops : 1;oc : $d8;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  828.          (i : A_FIDIVRL;ops : 1;oc : $da;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  829.          (i : A_FDIVRL;ops : 1;oc : $dc;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  830.          (i : A_FIDIVRS;ops : 1;oc : $de;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  831.          (i : A_F2XM1;ops : 0;oc : $d9f0;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  832.          (i : A_FYL2X;ops : 0;oc : $d9f1;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  833.          (i : A_FPTAN;ops : 0;oc : $d9f2;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  834.          (i : A_FPATAN;ops : 0;oc : $d9f3;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  835.          (i : A_FXTRACT;ops : 0;oc : $d9f4;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  836.          (i : A_FPREM1;ops : 0;oc : $d9f5;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  837.          (i : A_FDECSTP;ops : 0;oc : $d9f6;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  838.          (i : A_FINCSTP;ops : 0;oc : $d9f7;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  839.          (i : A_FPREM;ops : 0;oc : $d9f8;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  840.          (i : A_FYL2XP1;ops : 0;oc : $d9f9;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  841.          (i : A_FSQRT;ops : 0;oc : $d9fa;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  842.          (i : A_FSINCOS;ops : 0;oc : $d9fb;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  843.          (i : A_FRNDINT;ops : 0;oc : $d9fc;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  844.          (i : A_FSCALE;ops : 0;oc : $d9fd;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  845.          (i : A_FSIN;ops : 0;oc : $d9fe;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  846.          (i : A_FCOS;ops : 0;oc : $d9ff;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  847.          (i : A_FCHS;ops : 0;oc : $d9e0;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  848.          (i : A_FABS;ops : 0;oc : $d9e1;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  849.          (i : A_FNINIT;ops : 0;oc : $dbe3;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  850.          (i : A_FINIT;ops : 0;oc : $dbe3;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  851.          (i : A_FLDCW;ops : 1;oc : $d9;eb : 5;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  852.          (i : A_FNSTCW;ops : 1;oc : $d9;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  853.          (i : A_FSTCW;ops : 1;oc : $d9;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  854.          (i : A_FNSTSW;ops : 1;oc : $dfe0;eb : ao_none;m : NoModrm;o1 : ao_acc;o2 : 0;o3 : 0),
  855.          (i : A_FNSTSW;ops : 1;oc : $dd;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  856.          (i : A_FNSTSW;ops : 0;oc : $dfe0;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  857.          (i : A_FSTSW;ops : 1;oc : $dfe0;eb : ao_none;m : NoModrm;o1 : ao_acc;o2 : 0;o3 : 0),
  858.          (i : A_FSTSW;ops : 1;oc : $dd;eb : 7;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  859.          (i : A_FSTSW;ops : 0;oc : $dfe0;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  860.          (i : A_FNCLEX;ops : 0;oc : $dbe2;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  861.          (i : A_FCLEX;ops : 0;oc : $dbe2;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  862.          (i : A_FNSTENV;ops : 1;oc : $d9;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  863.          (i : A_FSTENV;ops : 1;oc : $d9;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  864.          (i : A_FLDENV;ops : 1;oc : $d9;eb : 4;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  865.          (i : A_FNSAVE;ops : 1;oc : $dd;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  866.          (i : A_FSAVE;ops : 1;oc : $dd;eb : 6;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  867.          (i : A_FRSTOR;ops : 1;oc : $dd;eb : 4;m : Modrm;o1 : ao_mem;o2 : 0;o3 : 0),
  868.          (i : A_FFREE;ops : 1;oc : $ddc0;eb : ao_none;m : ShortForm;o1 : ao_floatreg;o2 : 0;o3 : 0),
  869.          (i : A_FNOP;ops : 0;oc : $d9d0;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  870.          (i : A_FWAIT;ops : 0;oc : $9b;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  871. {         (i : A_ADDRaf_wORD;ops : 0;oc : $67;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0), }
  872. {         (i : A_WORD;ops : 0;oc : $66;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0), }
  873.          (i : A_LOCK;ops : 0;oc : $f0;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  874. {         (i : A_CS;ops : 0;oc : $2e;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  875.          (i : A_DS;ops : 0;oc : $3e;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  876.          (i : A_ES;ops : 0;oc : $26;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  877.          (i : A_FS;ops : 0;oc : $64;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  878.          (i : A_GS;ops : 0;oc : $65;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  879.          (i : A_SS;ops : 0;oc : $36;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0), }
  880.          (i : A_REP;ops : 0;oc : $f3;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  881.          (i : A_REPE;ops : 0;oc : $f3;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  882.          (i : A_REPNE;ops : 0;oc : $f2;eb : ao_none;m : NoModrm;o1 : 0;o2 : 0;o3 : 0),
  883.          (i : A_NONE));
  884.  
  885. {****************************************************************************
  886.                             Assembler Mnemoics
  887. ****************************************************************************}
  888.  
  889.      att_op2str : array[firstop..lastop] of string[7] =
  890.        ('mov','movz','movs','','add',
  891.         'call','idiv','imul','jmp','lea','mul','neg','not',
  892.         'pop','popal','push','pushal','ret','sub','xchg','xor',
  893.         'fild','cmp','jz','inc','dec','sete','setne','setl',
  894.         'setg','setle','setge','je','jne','jl','jg','jle','jge',
  895.         'or','fld','fadd','fmul','fsub','fdiv','fchs','fld1',
  896.         'fidiv','cltd','jnz','fstp','and','jno','','',
  897.         'enter','leave','cld','movs','rep','shl','shr','bound',
  898.         'jns','js','jo','sar','test',
  899.         'fcom','fcomp','fcompp','fxch','faddp','fmulp','fsubp','fdivp',
  900.         'fnsts','sahf','fdivrp','fsubrp','setc','setnc','jc','jnc',
  901.         'ja','jae','jb','jbe','seta','setae','setb','setbe',
  902.         'aaa','aad','aam','aas','cbw','cdq','clc','cli',
  903.         'clts','cmc','cwd','cwde','daa','das','hlt','iret','lahf',
  904.         'lods','lock','nop','pusha','pushf','pushfl',
  905.         'stc','std','sti','stos','wait','xlat','xlatb','movsb',
  906.         'movsbl','movsbw','movswl','movsb','movzwl','popa','in',
  907.         'out','lds','lcs','les','lfs','lgs','lss','popf','sbb','adc',
  908.         'div','ror','rol','rcl','rcr','sal','shld','shrd',
  909.         'lcall','ljmp','lret','jnae','jnb','jna','jnbe','jb','jnp',
  910.         'jpe','jpo','jnge','jng','jnl','jnle','jcxz','jecxz',
  911.         'loop','cmps','ins','outs','scas','bsf','bsr','bt','btc',
  912.         'btr','bts','int','int3','into','boundl','boundw',
  913.         'loopz','loope','loopnz','loopne','seto','setno','setnae',
  914.         'setnb','setz','setnz','setna','setnbe','sets','setns','setp',
  915.         'setpe','setnp','setpo','setnge','setnl','setng','setnle',
  916.         'arpl','lar','lgdt','lidt','lldt','lmsw','lsl','ltr','sgdt',
  917.         'sidt','sldt','smsw','str','verr','verw','fabs','fbld','fbstp',
  918.         'fclex','fnclex','fcos','fdecstp','fdisi','fndisi','fdivr',
  919.         'feni','fneni','ffree','fiadd','ficom','ficomp','fidivr',
  920.         'fimul','fincstp','finit','fninit','fist','fistp','fisub',
  921.         'fisubr','fldcw','fldenv','fldlg2','fldln2','fldl2e','fldl2t',
  922.         'fldpi','flds','fldz','fnop','fpatan','fprem','fprem1','fptan',
  923.         'frndint','frstor','fsave','fnsave','fscale','fsetpm','fsin',
  924.         'fsincos','fsqrt','fst','fstcw','fnstcw','fstenv','fnstenv',
  925.         'fstsw','fnstsw','ftst','fucom','fucomp','fucompp','fwait',
  926.         'fxam','fxtract','fyl2x','fyl2xp1','f2xm1','fildq','filds',
  927.         'fildl','fldl','fldt','fistq','fists','fistl','fstl','fsts',
  928.         'fstps','fistpl','fstpl','fistps','fistpq','fstpt','fcomps',
  929.         'ficompl','fcompl','ficomps','fcoms','ficoml','fcoml','ficoms',
  930.         'fiaddl','faddl','fiadds','fisubl','fsubl','fisubs','fsubs',
  931.         'fsubr','fsubrs','fisubrl','fsubrl','fisubrs','fmuls','fimull',
  932.         'fmull','fimuls','fdivs','fidivl','fdivl','fidivs','fdivrs',
  933.         'fidivrl','fdivrl','fidivrs','repe','repne','fadds','popfl',
  934.         { mmx instructions supported by GNU AS v281 }
  935.         'emms','movd','movq','packssdw','packsswb','packuswb',
  936.         'paddb','paddd','paddsb','paddsw','paddusb','paddusw',
  937.         'paddw','pand','pandn','pcmpeqb','pcmpeqd','pcmpeqw',
  938.         'pcmpgtb','pcmpgtd','pcmpgtw','pmaddwd','pmulhw',
  939.         'pmullw','por','pslld','psllq','psllw','psrad','psraw',
  940.         'psrld','psrlq','psrlw','psubb','psubd','psubsb','psubsw',
  941.         'psubusb','psubusw','psubw','punpckhbw','punpckhdq',
  942.         'punpckhwd','punpcklbw','punpckldq','punpcklwd','pxor');
  943.  
  944.      att_opsize2str : array[topsize] of string[2] =
  945.        ('','b','w','l','bw','bl','wl','q','s','t','d');
  946.  
  947.      att_reg2str : array[tregister] of string[6] =
  948.        ('','%eax','%ecx','%edx','%ebx','%esp','%ebp','%esi','%edi',
  949.         '%ax','%cx','%dx','%bx','%sp','%bp','%si','%di',
  950.         '%al','%cl','%dl','%bl','%ah','%ch','%bh','%dh',
  951.         '','%cs','%ds','%es','%fs','%gs','%ss',
  952.         '%st','%st(0)','%st(1)','%st(2)','%st(3)','%st(4)',
  953.         '%st(5)','%st(6)','%st(7)',
  954.         '%mm0','%mm1','%mm2','%mm3',
  955.         '%mm4','%mm5','%mm6','%mm7');
  956.  
  957.       int_op2str : array[firstop..lastop] of string[9] =
  958.        ('mov','movzx','movsx','','add',
  959.         'call','idiv','imul','jmp','lea','mul','neg','not',
  960.         'pop','popad','push','pushad','ret','sub','xchg','xor',
  961.         'fild','cmp','jz','inc','dec','sete','setne','setl',
  962.         'setg','setle','setge','je','jne','jl','jg','jle','jge',
  963.         'or','fld','fadd','fmul','fsub','fdiv','fchs','fld1',
  964.         'fidiv','cdq','jnz','fstp','and','jno','','',
  965.         'enter','leave','cld','movs','rep','shl','shr','bound',
  966.         'jns','js','jo','sar','test',
  967.         'fcom','fcomp','fcompp','fxch','faddp','fmulp','fsubrp','fdivp',
  968.         'fnsts','sahf','fdivp','fsubp','setc','setnc','jc','jnc',
  969.         'ja','jae','jb','jbe','seta','setae','setb','setbe',
  970.         'aaa','aad','aam','aas','cbw','cdq','clc','cli',
  971.         'clts','cmc','cwd','cwde','daa','das','hlt','iret','lahf',
  972.         'lods','lock','nop','pusha','pushf','pushfd',
  973.         'stc','std','sti','stos','wait','xlat','xlatb','movsx',
  974.         'movsx','movsx','movsx','movsx','movzx','popa','in',
  975.         'out','lds','lcs','les','lfs','lgs','lss','popf','sbb','adc',
  976.         'div','ror','rol','rcl','rcr','sal','shld','shrd',
  977.         'call','jmp','ret','jnae','jnb','jna','jnbe','jb','jnp',
  978.         'jpe','jpo','jnge','jng','jnl','jnle','jcxz','jecxz',
  979.         'loop','cmps','ins','outs','scas','bsf','bsr','bt','btc',
  980.         'btr','bts','int','int3','into','bound','bound',
  981.         'loopz','loope','loopnz','loopne','seto','setno','setnae',
  982.         'setnb','setz','setnz','setna','setnbe','sets','setns','setp',
  983.         'setpe','setnp','setpo','setnge','setnl','setng','setnle',
  984.         'arpl','lar','lgdt','lidt','lldt','lmsw','lsl','ltr','sgdt',
  985.         'sidt','sldt','smsw','str','verr','verw','fabs','fbld','fbstp',
  986.         'fclex','fnclex','fcos','fdecstp','fdisi','fndisi','fdivr',
  987.         'feni','fneni','ffree','fiadd','ficom','ficomp','fidivr',
  988.         'fimul','fincstp','finit','fninit','fist','fistp','fisub',
  989.         'fisubr','fldcw','fldenv','fldlg2','fldln2','fldl2e','fldl2t',
  990.         'fldpi','flds','fldz','fnop','fpatan','fprem','fprem1','fptan',
  991.         'frndint','frstor','fsave','fnsave','fscale','fsetpm','fsin',
  992.         'fsincos','fsqrt','fst','fstcw','fnstcw','fstenv','fnstenv',
  993.         'fstsw','fnstsw','ftst','fucom','fucomp','fucompp','fwait',
  994.         'fxam','fxtract','fyl2x','fyl2xp1','f2xm1','fildq','filds',
  995.         'fildl','fldl','fldt','fistq','fists','fistl','fstl','fsts',
  996.         'fstps','fistpl','fstpl','fistps','fistpq','fstpt','fcomps',
  997.         'ficompl','fcompl','ficomps','fcoms','ficoml','fcoml','ficoms',
  998.         'fiadd','fadd','fiadd','fisub','fsub','fisub','fsub',
  999.         'fsubr','fsubr','fisubr','fsubr','fisubr','fmul','fimul',
  1000.         'fmul','fimul','fdiv','fidiv','fdiv','fidiv','fdivr',
  1001.         'fidivr','fdivr','fidivr','repe','repne','fadd','popfd',
  1002.         { mmx instructions }
  1003.         'emms','movd','movq','packssdw','packsswb','packuswb',
  1004.         'paddb','paddd','paddsb','paddsw','paddusb','paddusw',
  1005.         'paddw','pand','pandn','pcmpeqb','pcmpeqd','pcmpeqw',
  1006.         'pcmpgtb','pcmpgtd','pcmpgtw','pmaddwd','pmulhw',
  1007.         'pmullw','por','pslld','psllq','psllw','psrad','psraw',
  1008.         'psrld','psrlq','psrlw','psubb','psubd','psubsb','psubsw',
  1009.         'psubusb','psubusw','psubw','punpckhbw','punpckhdq',
  1010.         'punpckhwd','punpcklbw','punpckldq','punpcklwd','pxor');
  1011.  
  1012.      int_reg2str : array[tregister] of string[5] =
  1013.        ('','eax','ecx','edx','ebx','esp','ebp','esi','edi',
  1014.         'ax','cx','dx','bx','sp','bp','si','di',
  1015.         'al','cl','dl','bl','ah','ch','bh','dh',
  1016.         '','cs','ds','es','fs','gs','ss',
  1017.         'st','st(0)','st(1)','st(2)','st(3)','st(4)','st(5)','st(6)','st(7)',
  1018.         'mm0','mm1','mm2','mm3','mm4','mm5','mm6','mm7');
  1019.  
  1020.      int_nasmreg2str : array[tregister] of string[5] =
  1021.        ('','eax','ecx','edx','ebx','esp','ebp','esi','edi',
  1022.         'ax','cx','dx','bx','sp','bp','si','di',
  1023.         'al','cl','dl','bl','ah','ch','bh','dh',
  1024.         '','cs','ds','es','fs','gs','ss',
  1025.         'st0','st0','st1','st2','st3','st4','st5','st6','st7',
  1026.         'mm0','mm1','mm2','mm3','mm4','mm5','mm6','mm7');
  1027.  
  1028.  
  1029.   implementation
  1030.  
  1031.     function reg2str(r : tregister) : string;
  1032.  
  1033.       const
  1034.          a : array[R_NO..R_BL] of string[3] =
  1035.           ('','EAX','ECX','EDX','EBX','ESP','EBP','ESI','EDI',
  1036.            'AX','CX','DX','BX','SP','BP','SI','DI',
  1037.            'AL','CL','DL','BL');
  1038.  
  1039.       begin
  1040.          reg2str:=a[r];
  1041.       end;
  1042.  
  1043.     function newreference(const r : treference) : preference;
  1044.  
  1045.       var
  1046.          p : preference;
  1047.  
  1048.       begin
  1049.          new(p);
  1050.          p^:=r;
  1051.          if assigned(r.symbol) then
  1052.            p^.symbol:=stringdup(r.symbol^);
  1053.          newreference:=p;
  1054.       end;
  1055.  
  1056.     function lab2str(l : plabel) : string;
  1057.  
  1058.       begin
  1059.          if (l=nil) or (l^.nb=0) then
  1060. {$ifdef EXTDEBUG}
  1061.            lab2str:='ILLEGAL'
  1062.          else
  1063.          begin
  1064.            if not(current_module^.output_format in [of_obj,of_nasm]) then
  1065.               lab2str:=target_info.labelprefix+tostr(l^.nb)
  1066.            else
  1067.               lab2str:='?L'+tostr(l^.nb);
  1068.          end;
  1069. {$else EXTDEBUG}
  1070.            internalerror(2000);
  1071.            if not(current_module^.output_format in [of_obj,of_nasm]) then
  1072.               lab2str:=target_info.labelprefix+tostr(l^.nb)
  1073.            else
  1074.               lab2str:='?L'+tostr(l^.nb);
  1075. {$endif EXTDEBUG}
  1076.          { was missed: }
  1077.          inc(l^.refcount);
  1078.          l^.is_used:=true;
  1079.       end;
  1080.  
  1081.     function reg8toreg16(reg : tregister) : tregister;
  1082.  
  1083.       begin
  1084.          reg8toreg16:=reg32toreg16(reg8toreg32(reg));
  1085.       end;
  1086.  
  1087.     function reg16toreg8(reg : tregister) : tregister;
  1088.  
  1089.       begin
  1090.          reg16toreg8:=reg32toreg8(reg16toreg32(reg));
  1091.       end;
  1092.  
  1093.     function reg16toreg32(reg : tregister) : tregister;
  1094.  
  1095.       begin
  1096.          reg16toreg32:=tregister(byte(reg)-byte(R_EDI));
  1097.       end;
  1098.  
  1099.     function reg32toreg16(reg : tregister) : tregister;
  1100.  
  1101.       begin
  1102.          reg32toreg16:=tregister(byte(reg)+byte(R_EDI));
  1103.       end;
  1104.  
  1105.     function reg32toreg8(reg : tregister) : tregister;
  1106.  
  1107.       begin
  1108.          reg32toreg8:=tregister(byte(reg)+byte(R_DI));
  1109.       end;
  1110.  
  1111.     function reg8toreg32(reg : tregister) : tregister;
  1112.  
  1113.       begin
  1114.          reg8toreg32:=tregister(byte(reg)-byte(R_DI));
  1115.       end;
  1116.  
  1117.     procedure reset_reference(var ref : treference);
  1118.  
  1119.       begin
  1120. {$ifdef ver0_6}
  1121.          ref.index:=R_NO;
  1122.          ref.base:=R_NO;
  1123.          ref.segment:=R_DEFAULT_SEG;
  1124.          ref.offset:=0;
  1125.          ref.scalefactor:=1;
  1126.          ref.isintvalue:=false;
  1127.          ref.symbol:=nil;
  1128. {$else}
  1129.          with ref do
  1130.            begin
  1131.               index:=R_NO;
  1132.               base:=R_NO;
  1133.               segment:=R_DEFAULT_SEG;
  1134.               offset:=0;
  1135.               scalefactor:=1;
  1136.               isintvalue:=false;
  1137.               symbol:=nil;
  1138.            end;
  1139. {$endif}
  1140.       end;
  1141.  
  1142.     procedure clear_reference(var ref : treference);
  1143.  
  1144.       begin
  1145.          stringdispose(ref.symbol);
  1146.          reset_reference(ref);
  1147.       end;
  1148.  
  1149.     procedure getlabel(var l : plabel);
  1150.  
  1151.       begin
  1152.          new(l);
  1153.          l^.nb:=nextlabelnr;
  1154.          l^.is_used:=false;
  1155.          l^.is_set:=false;
  1156.          l^.refcount:=0;
  1157.          inc(nextlabelnr);
  1158.       end;
  1159.  
  1160.     procedure freelabel(var l : plabel);
  1161.  
  1162.       begin
  1163.          if (l<>nil) and (not l^.is_set) and (not l^.is_used) then
  1164.            dispose(l);
  1165.          l:=nil;
  1166.       end;
  1167.  
  1168.     procedure setzerolabel(var l : plabel);
  1169.  
  1170.       begin
  1171.          l^.nb:=0;
  1172.          l^.is_used:=false;
  1173.          l^.is_set:=false;
  1174.          l^.refcount:=0;
  1175.       end;
  1176.  
  1177.     procedure getzerolabel(var l : plabel);
  1178.  
  1179.       begin
  1180.          new(l);
  1181.          l^.nb:=0;
  1182.          l^.is_used:=false;
  1183.          l^.is_set:=false;
  1184.          l^.refcount:=0;
  1185.       end;
  1186.  
  1187.     procedure getlabelnr(var l : longint);
  1188.  
  1189.       begin
  1190.          l:=nextlabelnr;
  1191.          inc(nextlabelnr);
  1192.       end;
  1193.  
  1194.     function newcsymbol(const s : string;l : longint) : pcsymbol;
  1195.  
  1196.       var
  1197.          p : pcsymbol;
  1198.  
  1199.       begin
  1200.          new(p);
  1201.          p^.symbol:=strpnew(s);
  1202.          p^.offset:=l;
  1203.          newcsymbol:=p;
  1204.       end;
  1205.  
  1206.     procedure disposecsymbol(p : pcsymbol);
  1207.  
  1208.       begin
  1209.       strdispose(p^.symbol);
  1210.       dispose(p);
  1211.       end;
  1212.  
  1213. {****************************************************************************
  1214.                              TAI386
  1215.  ****************************************************************************}
  1216.  
  1217.     constructor tai386.op_none(op : tasmop;_size : topsize);
  1218.  
  1219.       begin
  1220.          inherited init;
  1221.          typ:=ait_instruction;
  1222.          _operator:=op;
  1223.          opxt:=0;
  1224.          size:=_size;
  1225.  
  1226.          { the following isn't required ! }
  1227.          op1:=nil;
  1228.          op2:=nil;
  1229.       end;
  1230.  
  1231.     constructor tai386.op_reg(op : tasmop;_size : topsize;_op1 : tregister);
  1232.  
  1233.       begin
  1234.          inherited init;
  1235.          typ:=ait_instruction;
  1236.          _operator:=op;
  1237.          opxt:=Top_reg;
  1238.          size:=_size;
  1239.          op1:=pointer(_op1);
  1240.  
  1241.          op2:=nil;
  1242.       end;
  1243.  
  1244.     constructor tai386.op_const(op : tasmop;_size : topsize;_op1 : longint);
  1245.  
  1246.       begin
  1247.          inherited init;
  1248.          typ:=ait_instruction;
  1249.          _operator:=op;
  1250.          opxt:=Top_const;
  1251.          size:=_size;
  1252.          op1:=pointer(_op1);
  1253.  
  1254.          op2:=nil;
  1255.       end;
  1256.  
  1257.     constructor tai386.op_ref(op : tasmop;_size : topsize;_op1 : preference);
  1258.  
  1259.       begin
  1260.          inherited init;
  1261.          typ:=ait_instruction;
  1262.          _operator:=op;
  1263.          size:=_size;
  1264.          if _op1^.isintvalue then
  1265.            begin
  1266.               opxt:=top_const;
  1267.               op1:=pointer(_op1^.offset);
  1268.            end
  1269.          else
  1270.            begin
  1271.               opxt:=top_ref;
  1272.               op1:=pointer(_op1);
  1273.            end;
  1274.  
  1275.          op2:=nil;
  1276.       end;
  1277.  
  1278.     constructor tai386.op_loc(op : tasmop;_size : topsize;_op1 : tlocation);
  1279.  
  1280.       begin
  1281.          inherited init;
  1282.          typ:=ait_instruction;
  1283.          _operator:=op;
  1284.          size:=_size;
  1285.          if (_op1.loc=loc_register) or (_op1.loc=loc_cregister)  then
  1286.            begin
  1287.              opxt:=top_reg;
  1288.              op1:=pointer(_op1.register);
  1289.            end
  1290.          else
  1291.          if _op1.reference.isintvalue then
  1292.            begin
  1293.               opxt:=top_const;
  1294.               op1:=pointer(_op1.reference.offset);
  1295.            end
  1296.          else
  1297.            begin
  1298.               opxt:=top_ref;
  1299.               op1:=pointer(newreference(_op1.reference));
  1300.            end;
  1301.  
  1302.          op2:=nil;
  1303.       end;
  1304.  
  1305.     constructor tai386.op_reg_reg(op : tasmop;_size : topsize;_op1,_op2 : tregister);
  1306.  
  1307.       begin
  1308.          inherited init;
  1309.          typ:=ait_instruction;
  1310.          _operator:=op;
  1311.          opxt:=Top_reg shl 4+Top_reg;
  1312.          size:=_size;
  1313.          op1:=pointer(_op1);
  1314.          op2:=pointer(_op2);
  1315.  
  1316.       end;
  1317.  
  1318.     constructor tai386.op_reg_ref(op : tasmop;_size : topsize;_op1 : tregister;_op2 : preference);
  1319.  
  1320.       begin
  1321.          inherited init;
  1322.          typ:=ait_instruction;
  1323.          _operator:=op;
  1324.          opxt:=top_reg;
  1325.          size:=_size;
  1326.          op1:=pointer(_op1);
  1327.  
  1328.          if _op2^.isintvalue then
  1329.            begin
  1330.               opxt:=opxt+top_const shl 4;
  1331.               op2:=pointer(_op2^.offset);
  1332.            end
  1333.          else
  1334.            begin
  1335.               opxt:=opxt+top_ref shl 4;
  1336.               op2:=pointer(_op2);
  1337.            end;
  1338.  
  1339.       end;
  1340.  
  1341.     constructor tai386.op_reg_loc(op : tasmop;_size : topsize;_op1 : tregister;_op2 : tlocation);
  1342.  
  1343.       begin
  1344.          inherited init;
  1345.          typ:=ait_instruction;
  1346.          _operator:=op;
  1347.          opxt:=top_reg;
  1348.          size:=_size;
  1349.          op1:=pointer(_op1);
  1350.  
  1351.          if (_op2.loc=loc_register) or (_op2.loc=loc_cregister)  then
  1352.            begin
  1353.              opxt:=opxt+top_reg shl 4;
  1354.              op2:=pointer(_op2.register);
  1355.            end
  1356.          else
  1357.          if _op2.reference.isintvalue then
  1358.            begin
  1359.               opxt:=opxt+top_const shl 4;
  1360.               op2:=pointer(_op2.reference.offset);
  1361.            end
  1362.          else
  1363.            begin
  1364.               opxt:=opxt+Top_ref shl 4;
  1365.               op2:=pointer(newreference(_op2.reference));
  1366.            end;
  1367.  
  1368.       end;
  1369.  
  1370.     constructor tai386.op_loc_reg(op : tasmop;_size : topsize;_op1 : tlocation;_op2 : tregister);
  1371.  
  1372.       begin
  1373.          inherited init;
  1374.          typ:=ait_instruction;
  1375.          _operator:=op;
  1376.          opxt:=top_reg shl 4;
  1377.          size:=_size;
  1378.          op2:=pointer(_op2);
  1379.  
  1380.          if (_op1.loc=loc_register) or (_op1.loc=loc_cregister)  then
  1381.            begin
  1382.              opxt:=opxt+top_reg;
  1383.              op1:=pointer(_op1.register);
  1384.            end
  1385.          else
  1386.          if _op1.reference.isintvalue then
  1387.            begin
  1388.               opxt:=opxt+top_const;
  1389.               op1:=pointer(_op1.reference.offset);
  1390.            end
  1391.          else
  1392.            begin
  1393.               opxt:=opxt+top_ref;
  1394.               op1:=pointer(newreference(_op1.reference));
  1395.            end;
  1396.  
  1397.       end;
  1398.  
  1399.     constructor tai386.op_const_reg_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister;_op3 : tregister);
  1400.  
  1401.     type    twowords=record
  1402.                 word1,word2:word;
  1403.             end;
  1404.  
  1405.       begin
  1406.          inherited init;
  1407.          typ:=ait_instruction;
  1408.          _operator:=op;
  1409.          opxt:=Top_const+Top_reg shl 4+Top_reg shl 8;
  1410.          size:=_size;
  1411.          op1:=pointer(_op1);
  1412.          twowords(op2).word1:=word(_op2);
  1413.          twowords(op2).word2:=word(_op3);
  1414.       end;
  1415.  
  1416.     constructor tai386.op_const_reg(op : tasmop;_size : topsize;_op1 : longint;_op2 : tregister);
  1417.  
  1418.       begin
  1419.          inherited init;
  1420.          typ:=ait_instruction;
  1421.          _operator:=op;
  1422.          if (op=A_CMP) and (_size=S_B) and
  1423.             ((_op2<R_AL) or (_op2>R_DH)) then
  1424.            begin
  1425. {$ifdef extdebug}
  1426.               comment(v_warning,'wrong size for A_CMP due to implicit size extension !!');
  1427. {$endif extdebug}
  1428.               _size:=S_L;
  1429.            end;
  1430.          opxt:=Top_const+Top_reg shl 4;
  1431.          size:=_size;
  1432.          op1:=pointer(_op1);
  1433.          op2:=pointer(_op2);
  1434.  
  1435.       end;
  1436.  
  1437.     constructor tai386.op_const_const(op : tasmop;_size : topsize;_op1,_op2 : longint);
  1438.  
  1439.       begin
  1440.          inherited init;
  1441.          typ:=ait_instruction;
  1442.          _operator:=op;
  1443.          opxt:=Top_const+Top_const shl 4;
  1444.          size:=_size;
  1445.          op1:=pointer(_op1);
  1446.          op2:=pointer(_op2);
  1447.  
  1448.       end;
  1449.  
  1450.     constructor tai386.op_const_ref(op : tasmop;_size : topsize;_op1 : longint;_op2 : preference);
  1451.  
  1452.       begin
  1453.          inherited init;
  1454.          typ:=ait_instruction;
  1455.          _operator:=op;
  1456.          opxt:=top_const;
  1457.          size:=_size;
  1458.          op1:=pointer(_op1);
  1459.  
  1460.          if _op2^.isintvalue then
  1461.            begin
  1462.               opxt:=opxt+top_const shl 4;
  1463.               op2:=pointer(_op2^.offset);
  1464.            end
  1465.          else
  1466.            begin
  1467.               opxt:=opxt+top_ref shl 4;
  1468.               op2:=pointer(_op2);
  1469.            end;
  1470.  
  1471.       end;
  1472.  
  1473.     constructor tai386.op_const_loc(op : tasmop;_size : topsize;_op1 : longint;_op2 : tlocation);
  1474.  
  1475.       begin
  1476.          inherited init;
  1477.          typ:=ait_instruction;
  1478.          _operator:=op;
  1479.          opxt:=top_const;
  1480.          size:=_size;
  1481.          op1:=pointer(_op1);
  1482.  
  1483.          if (_op2.loc=loc_register) or (_op2.loc=loc_cregister)  then
  1484.            begin
  1485.              opxt:=opxt+Top_reg shl 4;
  1486.              op2:=pointer(_op2.register);
  1487.            end
  1488.          else
  1489.          if _op2.reference.isintvalue then
  1490.            begin
  1491.               opxt:=opxt+top_const shl 4;
  1492.               op2:=pointer(_op2.reference.offset);
  1493.            end
  1494.          else
  1495.            begin
  1496.               opxt:=opxt+top_ref shl 4;
  1497.               op2:=pointer(newreference(_op2.reference));
  1498.            end;
  1499.  
  1500.       end;
  1501.  
  1502.     constructor tai386.op_ref_reg(op : tasmop;_size : topsize;_op1 : preference;_op2 : tregister);
  1503.  
  1504.       begin
  1505.          inherited init;
  1506.          typ:=ait_instruction;
  1507.          _operator:=op;
  1508.          opxt:=top_reg shl 4;
  1509.          size:=_size;
  1510.          op2:=pointer(_op2);
  1511.  
  1512.          if _op1^.isintvalue then
  1513.            begin
  1514.               opxt:=opxt+top_const;
  1515.               op1:=pointer(_op1^.offset);
  1516.            end
  1517.          else
  1518.            begin
  1519.               opxt:=opxt+top_ref;
  1520.               op1:=pointer(_op1);
  1521.            end;
  1522.  
  1523.       end;
  1524.  
  1525.     constructor tai386.op_ref_ref(op : tasmop;_size : topsize;_op1,_op2 : preference);
  1526.  
  1527.       begin
  1528.          inherited init;
  1529.          typ:=ait_instruction;
  1530.          _operator:=op;
  1531.          size:=_size;
  1532.  
  1533.          if _op1^.isintvalue then
  1534.            begin
  1535.               opxt:=top_const;
  1536.               op1:=pointer(_op1^.offset);
  1537.            end
  1538.          else
  1539.            begin
  1540.               opxt:=top_ref;
  1541.               op1:=pointer(_op1);
  1542.            end;
  1543.  
  1544.          if _op2^.isintvalue then
  1545.            begin
  1546.               opxt:=opxt+top_const shl 4;
  1547.               op2:=pointer(_op2^.offset);
  1548.            end
  1549.          else
  1550.            begin
  1551.               opxt:=opxt+top_ref shl 4;
  1552.               op2:=pointer(_op2);
  1553.            end;
  1554.  
  1555.       end;
  1556.  
  1557.     constructor tai386.op_csymbol(op : tasmop;_size : topsize;_op1 : pcsymbol);
  1558.  
  1559.       begin
  1560.          inherited init;
  1561.          typ:=ait_instruction;
  1562.          _operator:=op;
  1563.          if (op=A_CALL) and (use_esp_stackframe) then
  1564.           Message(cg_e_stackframe_with_esp);
  1565.          opxt:=top_symbol;
  1566.          size:=_size;
  1567.          op1:=pointer(_op1);
  1568.          op2:=nil;
  1569.       end;
  1570.  
  1571.     constructor tai386.op_csymbol_reg(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : tregister);
  1572.  
  1573.       begin
  1574.          inherited init;
  1575.          typ:=ait_instruction;
  1576.          _operator:=op;
  1577.          opxt:=Top_symbol+Top_reg shl 4;
  1578.          size:=_size;
  1579.          op1:=pointer(_op1);
  1580.          op2:=pointer(_op2);
  1581.  
  1582.       end;
  1583.  
  1584.     constructor tai386.op_csymbol_ref(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : preference);
  1585.  
  1586.       begin
  1587.          inherited init;
  1588.          typ:=ait_instruction;
  1589.          _operator:=op;
  1590.          opxt:=top_symbol;
  1591.          size:=_size;
  1592.          op1:=pointer(_op1);
  1593.  
  1594.          if _op2^.isintvalue then
  1595.            begin
  1596.               opxt:=opxt+top_const shl 4;
  1597.               op2:=pointer(_op2^.offset);
  1598.            end
  1599.          else
  1600.            begin
  1601.               opxt:=opxt+top_ref shl 4;
  1602.               op2:=pointer(_op2);
  1603.            end;
  1604.  
  1605.       end;
  1606.  
  1607.     constructor tai386.op_csymbol_loc(op : tasmop;_size : topsize;_op1 : pcsymbol;_op2 : tlocation);
  1608.  
  1609.       begin
  1610.          inherited init;
  1611.          typ:=ait_instruction;
  1612.          _operator:=op;
  1613.          opxt:=top_symbol;
  1614.          size:=_size;
  1615.          op1:=pointer(_op1);
  1616.  
  1617.          if (_op2.loc=loc_register) or (_op2.loc=loc_cregister)  then
  1618.            begin
  1619.              opxt:=top_reg shl 4;
  1620.              op2:=pointer(_op2.register);
  1621.            end
  1622.          else
  1623.          if _op2.reference.isintvalue then
  1624.            begin
  1625.               opxt:=opxt+top_const shl 4;
  1626.               op2:=pointer(_op2.reference.offset);
  1627.            end
  1628.          else
  1629.            begin
  1630.               opxt:=opxt+top_ref shl 4;
  1631.               op2:=pointer(newreference(_op2.reference));
  1632.            end;
  1633.  
  1634.       end;
  1635.  
  1636.     constructor tai386.op_reg_const(op:tasmop; _size: topsize; _op1: tregister; _op2: longint);
  1637.     begin
  1638.          inherited init;
  1639.          typ:=ait_instruction;
  1640.          _operator:=op;
  1641.          opxt:=top_reg+top_const shl 4;
  1642.          size:=_size;
  1643.          op1:=pointer(_op1);
  1644.          op2:=pointer(_op2);
  1645.     end;
  1646.  
  1647.    function Tai386.op1t:byte;
  1648.  
  1649.     begin
  1650.         op1t:=opxt and 15;
  1651.     end;
  1652.  
  1653.    function Tai386.op2t:byte;
  1654.  
  1655.     begin
  1656.         op2t:=(opxt shr 4) and 15;
  1657.     end;
  1658.  
  1659.    function Tai386.op3t:byte;
  1660.  
  1661.     begin
  1662.         op3t:=(opxt shr 8) and 15;
  1663.     end;
  1664.  
  1665.    destructor tai386.done;
  1666.  
  1667.      begin
  1668.         if op1t=top_symbol then
  1669.           disposecsymbol(pcsymbol(op1))
  1670.         else if op1t=top_ref then
  1671.           begin
  1672.              clear_reference(preference(op1)^);
  1673.              dispose(preference(op1));
  1674.           end;
  1675.         if op2t=top_symbol then
  1676.           disposecsymbol(pcsymbol(op2))
  1677.         else if op2t=top_ref then
  1678.           begin
  1679.              clear_reference(preference(op2)^);
  1680.              dispose(preference(op2));
  1681.           end;
  1682.      end;
  1683.  
  1684. {****************************************************************************
  1685.                              TAI_LABELED
  1686.  ****************************************************************************}
  1687.  
  1688.     constructor tai_labeled.init(op : tasmop; l : plabel);
  1689.  
  1690.       begin
  1691.          inherited init;
  1692.          typ:=ait_labeled_instruction;
  1693.          _operator:=op;
  1694.          lab:=l;
  1695.          lab^.is_used:=true;
  1696.          inc(lab^.refcount);
  1697.       end;
  1698.  
  1699.     destructor tai_labeled.done;
  1700.  
  1701.       begin
  1702.          dec(lab^.refcount);
  1703.          if lab^.refcount=0 then
  1704.            Begin
  1705.              lab^.is_used := False;
  1706.              If Not(lab^.is_set) Then
  1707.                Dispose(lab);
  1708.            End;
  1709.       end;
  1710.  
  1711. end.
  1712. {
  1713.   $Log: i386.pas,v $
  1714.   Revision 1.1.1.1.2.1  1998/04/06 16:21:09  peter
  1715.     * carl and mine bugfixes from the mainbranch applied
  1716.  
  1717.   Revision 1.1.1.1  1998/03/25 11:18:13  root
  1718.   * Restored version
  1719.  
  1720.   Revision 1.21  1998/03/10 16:27:39  pierre
  1721.     * better line info in stabs debug
  1722.     * symtabletype and lexlevel separated into two fields of tsymtable
  1723.     + ifdef MAKELIB for direct library output, not complete
  1724.     + ifdef CHAINPROCSYMS for overloaded seach across units, not fully
  1725.       working
  1726.     + ifdef TESTFUNCRET for setting func result in underfunction, not
  1727.       working
  1728.  
  1729.   Revision 1.20  1998/03/10 01:17:19  peter
  1730.     * all files have the same header
  1731.     * messages are fully implemented, EXTDEBUG uses Comment()
  1732.     + AG... files for the Assembler generation
  1733.  
  1734.   Revision 1.19  1998/03/09 12:58:11  peter
  1735.     * FWait warning is only showed for Go32V2 and $E+
  1736.     * opcode tables moved to i386.pas/m68k.pas to reduce circular uses (and
  1737.       for m68k the same tables are removed)
  1738.     + $E for i386
  1739.  
  1740.   Revision 1.18  1998/03/06 00:52:19  peter
  1741.     * replaced all old messages from errore.msg, only ExtDebug and some
  1742.       Comment() calls are left
  1743.     * fixed options.pas
  1744.  
  1745.   Revision 1.17  1998/03/02 01:48:38  peter
  1746.     * renamed target_DOS to target_GO32V1
  1747.     + new verbose system, merged old errors and verbose units into one new
  1748.       verbose.pas, so errors.pas is obsolete
  1749.  
  1750.   Revision 1.16  1998/02/28 00:20:25  florian
  1751.     * more changes to get import libs for Win32 working
  1752.  
  1753.   Revision 1.15  1998/02/25 12:32:16  daniel
  1754.   * Compiler uses even less memory.
  1755.  
  1756.   Revision 1.14  1998/02/13 10:35:06  daniel
  1757.   * Made Motorola version compilable.
  1758.   * Fixed optimizer
  1759.  
  1760.   Revision 1.13  1998/02/12 17:19:04  florian
  1761.     * fixed to get remake3 work, but needs additional fixes (output, I don't like
  1762.       also that aktswitches isn't a pointer)
  1763.  
  1764.   Revision 1.12  1998/02/12 11:50:08  daniel
  1765.   Yes! Finally! After three retries, my patch!
  1766.  
  1767.   Changes:
  1768.  
  1769.   Complete rewrite of psub.pas.
  1770.   Added support for DLL's.
  1771.   Compiler requires less memory.
  1772.   Platform units for each platform.
  1773.  
  1774.   Revision 1.11  1998/02/04 22:01:59  florian
  1775.     + S_D for MMX MOVD added, but unused
  1776.  
  1777.   Revision 1.10  1998/01/16 22:34:33  michael
  1778.   * Changed 'conversation' to 'conversion'. Waayyy too much chatting going on
  1779.     in this compiler :)
  1780.  
  1781.   Revision 1.9  1997/12/13 18:59:46  florian
  1782.   + I/O streams are now also declared as external, if neccessary
  1783.   * -Aobj generates now a correct obj file via nasm
  1784.  
  1785.   Revision 1.8  1997/12/09 13:42:09  carl
  1786.   * bugfix of lab2str with nasm output
  1787.     (. = local label in nasm, which would cause some problems sometimes)
  1788.   * bugfix of out reg,imm8 (missing instruction template)
  1789.   + renamed pai_labeled386 --> pai_labeled
  1790.   + added extended size constant
  1791.  
  1792.   Revision 1.7  1997/12/08 11:43:43  pierre
  1793.      * syntax error in previous commit
  1794.  
  1795.   Revision 1.6  1997/12/08 10:12:05  pierre
  1796.      * bug fix for cmpb for a value in the range 129-255 :
  1797.        if the destination is a word or lognint reg then there is an implicit sign
  1798.        extension of the const (thus becoming -127 to -1)
  1799.      + redefined ao_floatreg to include the floatacc (used in ratti386.pas)
  1800.  
  1801.   Revision 1.5  1997/11/28 23:46:09  florian
  1802.   LOC_CMMXREGISTER added
  1803.  
  1804.   Revision 1.4  1997/11/28 19:56:41  carl
  1805.   * forgot dtou!
  1806.  
  1807.   Revision 1.3  1997/11/28 18:15  pierre
  1808.    working version with several bug fixes
  1809.  
  1810.   Revision 1.2  1997/11/28 14:53:38  carl
  1811.   + added popad,popfd,pushad,pushfd in op table.
  1812.  
  1813.   Revision 1.1.1.1  1997/11/27 08:32:56  michael
  1814.   FPC Compiler CVS start
  1815.  
  1816.   Pre-CVS log:
  1817.  
  1818.   FK     Florian Klaempfl
  1819.   PM     Pierre Muller
  1820.   +      feature added
  1821.   -      removed
  1822.   *      bug fixed or changed
  1823.  
  1824.   History:
  1825.       30th september 1996:
  1826.          + unit started
  1827.       15th october 1996:
  1828.          + tai386 added
  1829.          + some code from asmgen moved to this unit
  1830.       26th november 1996:
  1831.          + tai386_labeled
  1832.       15th october 1997:
  1833.          + lab2str increments also refcount (FK)
  1834.       6th november 1997:
  1835.          * added S_T for s80real fldt and fstpt (PM)
  1836.       20th november 1997:
  1837.          * changed LOC_FPUSTACK to LOC_FPU for compatibility with m68k (PM)
  1838.  
  1839. }
  1840.